簡體   English   中英

符號可見性和gcc警告

[英]Symbol visibility and gcc warnings

這是Symbol可見性和命名空間的后續問題

我稍微修改一下這個例子,因為它不是關於命名空間的:

namespace MyDSO {
  struct __attribute__ ((visibility ("hidden"))) Foo {
    void bar() {}
  };
}

struct Bar {
  MyDSO::Foo foo;
};

int main() {}

通過gcc example.cpp -o example編譯gcc example.cpp -o example吐出警告'Bar' declared with greater visibility than the type of its field 'Bar::foo'鏈接問題中'Bar' declared with greater visibility than the type of its field 'Bar::foo'

問題:如果我,為什么收到警告

a)明確地向結構欄添加默認可見性,即我有

namespace MyDSO {
  struct __attribute__ ((visibility ("hidden"))) Foo {
    void bar() {}
  };
}

struct __attribute__ ((visibility ("default"))) Bar {
  MyDSO::Foo foo;
};

int main() {}

b)刪除隱藏的可見性,向Bar添加默認可見性並使用-fvisibility="hidden"編譯?

在我看來,最終結果是相同的,實際上,所有二進制文件都是完全相同的(gcc 7.3.1,但也包括較舊的二進制文件)。 如果我將兩個結構分成兩個類並用它們構建一個靜態庫,那么符號表(objdump -t -C)包含完全相同的符號和完全相同的修飾符(全局,本地等),只有幾個條目第一列(虛擬地址)不同。

在這兩種情況下,顯式可見性屬性是在每個類的基礎上使警告靜音的預期方式。 來自gcc/cp/decl2.c

/* Don't warn about visibility if the class has explicit visibility.  */
if (CLASSTYPE_VISIBILITY_SPECIFIED (type))
  vis = VISIBILITY_INTERNAL;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM