13

我在编译(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].

GCC 没有给出这个警告。只有 G++ 可以。

添加静态清除警告:

static struct {
} a;

我无法弄清楚这意味着什么,特别是为什么typelinkage. 我认为链接取决于变量的声明位置和方式,而不取决于变量本身的类型。

4

2 回答 2

15

这意味着变量a具有链接,例如可以在其他翻译单元中可见。但是,它的匿名类型只有内部链接(没有 [外部] 链接),因此您实际上无法访问a任何其他翻译单元中的变量,因为您无法访问其类型。

将变量设为静态将为其提供内部链接,因此类型和变量在其他翻译单元中均不可见。

我不确定在这种情况下匿名命名空间是否会起到同样的作用(无法访问编译器来检查)。

于 2013-07-29T04:35:03.010 回答
8

错误是因为您声明了一个a具有匿名类型的变量(结构后没有类型名)。我假设警告是因为您不能再次声明该类型的变量(不使用 decltype)。我假设g++给出了警告,而不是gcc因为 c++ 往往是一种更严格的语言。我还使用clang++and对其进行了测试,clang即使使用-Wall.

我会假设 static 摆脱了警告,因为它只能在那个文件中使用(意味着没有外部链接),很难a在不同的文件中使用,因为你不知道它的类型或访问它的成员.

编辑:不幸的是,根据警告中的链接确实是一个错误(无论多么轻微)并且已得到修复。

于 2013-07-29T01:26:06.213 回答