C ++警告:匿名类型,没有用于声明变量的链接

时间:2013-07-29 00:21:47

标签: 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].

GCC不会发出此警告。只有G ++才有。

添加 静态 会清除警告:

static struct {
} a;

我无法弄清楚它的含义,尤其是为什么typelinkage有关。我认为链接取决于声明变量的位置和方式,而不取决于变量本身的类型。

2 个答案:

答案 0 :(得分:13)

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

将变量设为静态将使其具有内部链接,因此在其他翻译单元中不会显示类型和变量。

如果匿名命名空间在这种情况下用于相同的目的,我不确定(无法访问要检查的编译器)。

答案 1 :(得分:8)

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

我会假设静态消除了警告,因为它只能在那个文件中使用(意味着没有外部链接),因为你不知道在另一个文件中使用a会很困难它的类型或访问它的成员。

编辑:不幸的是,根据警告中的link确实是一个错误(无论多么小)并且已经修复。