gpt4 book ai didi

c++ - 符号可见性和 gcc 警告

转载 作者:太空狗 更新时间:2023-10-29 22:55:42 25 4
gpt4 key购买 nike

这是 Symbol visibility and namespace 的后续问题。

我将稍微修改示例,因为它实际上与命名空间无关:

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

struct Bar {
MyDSO::Foo foo;
};

int main() {}

通过 gcc example.cpp -o example 编译会发出警告 'Bar' declared with greater visibility than the type of its field 'Bar::foo' 作为在链接的问题中。

问题:为什么我收到警告,如果我

a) 显式地为 struct Bar 添加默认可见性,即我有

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;

关于c++ - 符号可见性和 gcc 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50633049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com