ROT*_*OGG 12 c++ g++ compiler-warnings linkage
我在编译时看到了这条警告信息(gcc 4.6.3,ubuntu)示例:
struct {
} a;
int main()
{
}
warning: anonymous type with no linkage used to declare variable ‘<anonymous struct> a’ with linkage [enabled by default].
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会不会发出此警告.只有G ++才有.
添加静态清除警告:
static struct {
} a;
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚它意味着什么,特别是为什么type与之相关linkage.我认为链接取决于声明变量的位置和方式,而不取决于变量本身的类型.
Mar*_*k B 13
这意味着变量a具有链接,例如可以在其他翻译单元中可见.但是它的匿名类型只有内部链接(没有[外部]链接),因此您无法a在任何其他翻译单元中实际访问该变量,因为您无法访问其类型.
使变量静态将使其具有内部链接,因此在其他翻译单元中看不到类型和变量.
如果匿名命名空间在这种情况下用于相同的目的,我不确定(无法访问要检查的编译器).
该错误是因为您声明了一个a具有匿名类型的变量(struct之后没有typename).我假设警告是因为你不能再次声明该类型的变量(不使用decltype).我假设g++给出警告而不是gcc因为c ++往往是一种更严格的语言.我也用它来测试它,clang++并且clang它们甚至没有产生任何警告-Wall.
我会假设静态摆脱警告,因为它只能在那个文件中使用(意味着没有外部链接),a在其他文件中使用会很困难,因为你不知道它的类型或者有权访问它的成员.
编辑:不幸的是根据警告中的链接确实是一个错误(但是很小)并且已经修复.