gcc和msvc编译这段代码时出现了错误,错误信息为namespace-scope anonymous aggregates must be static
。但是clang编译没有问题。
https://godbolt.org/z/WecT6vP91
namespace {
union {
int a;
long b;
};
}
https://en.cppreference.com/w/cpp/language/union中写道:
命名空间作用域的匿名联合必须声明为静态的,除非它们出现在未命名的命名空间中。
这似乎是gcc和msvc的一个bug?
编辑:
然而,Clang拒绝编译未在未命名命名空间中嵌套的命名命名空间中的非静态匿名联合。此规则是否可以更改为“...除非它们出现在直接或间接的未命名命名空间中”(这似乎有另外一个问题,请参见下文)或 “... 除非它们具有内部链接”?或者为什么不行?
namespace {
namespace ns {
union {
int a;
long b;
};
}
}
根据未命名命名空间内名称的外部链接,未命名命名空间中的名称可以具有C语言链接。即使Clang接受具有C语言链接的非静态匿名联合体,但实际上不会生成链接符号,这似乎毫无意义。它是否被标准允许?如果允许,那么在直接或间接未命名命名空间内使用
extern "C"
有什么效果?namespace {
extern "C" union {
int a;
long b;
};
}