【发布时间】:2022-01-06 00:20:08
【问题描述】:
gcc 和 msvc 无法编译这段代码,错误 msg 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 的错误?
已编辑:
但是,Clang 拒绝在嵌套在未命名命名空间中的命名命名空间中编译非静态匿名联合。规则是否可以更改为“......除非它们出现在直接或间接的未命名命名空间中”(这似乎还有另一个问题,见下文)或“......除非它们具有内部链接”?或者为什么不能?
namespace {
namespace ns {
union {
int a;
long b;
};
}
}
根据External linkage for name inside unnamed namespace,未命名命名空间中的名称可以具有C语言链接。 Clang 甚至接受具有 C 语言链接的非静态匿名联合,但实际上没有生成链接符号,这似乎没有意义。标准允许吗?如果允许,extern "C" 在直接或间接无名命名空间中的作用是什么?
namespace {
extern "C" union {
int a;
long b;
};
}
【问题讨论】:
-
是吗?询问和回答。
标签: c++ language-lawyer