我在编译(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;
我无法弄清楚它的含义,尤其是为什么type
与linkage
有关。我认为链接取决于声明变量的位置和方式,而不取决于变量本身的类型。
答案 0 :(得分:13)
这意味着变量a
具有链接,例如可以在其他翻译单元中看到。但是它的匿名类型只有内部链接(没有[外部]链接),所以你不能在任何其他翻译单元中实际访问变量a
,因为你无法访问它的类型。
将变量设为静态将使其具有内部链接,因此在其他翻译单元中不会显示类型和变量。
如果匿名命名空间在这种情况下用于相同的目的,我不确定(无法访问要检查的编译器)。
答案 1 :(得分:8)
错误是因为您声明了一个变量a
,它具有匿名类型(struct之后没有typename)。我假设警告是因为你不能再次声明该类型的变量(不使用decltype)。我假设g++
给出警告而不是gcc
,因为c ++往往是一种更严格的语言。我还使用clang++
和clang
对其进行了测试,即使使用-Wall
也不会产生任何警告。
我会假设静态消除了警告,因为它只能在那个文件中使用(意味着没有外部链接),因为你不知道在另一个文件中使用a
会很困难它的类型或访问它的成员。
编辑:不幸的是,根据警告中的link确实是一个错误(无论多么小)并且已经修复。