【发布时间】:2019-04-30 07:49:27
【问题描述】:
以下代码合法吗?:
struct
{
int x;
};
这段代码只是定义了一个未命名的结构。我不打算创建这种类型的对象,也不需要以任何其他方式使用这种结构。它只是作为某些复杂宏扩展的副作用出现在源代码中。
虽然没用,但我认为没有问题。只是另一段可以编译然后完全优化出来的代码。
然而,在现实世界中,结果与我的预期大相径庭:
GCC 8.3 报错:
错误:抽象声明器“”用作声明
Clang 8.0.0 也报错:
错误:匿名结构和类必须是类成员
警告:声明没有声明任何东西 [-Wmissing-declarations]
只有 MSVC 2017 认为此类来源没有问题。
所以,问题是:谁是对的?标准中是否有明确禁止此类声明的相关引用?
编辑:
该项目使用 C++11。但是 C++98、C++11 和 C++17 的错误信息是一样的。
【问题讨论】:
-
根据stackoverflow.com/a/12785369/969365 C++ 不允许匿名结构(但它说 C11 允许,并且未来对 C++ 的修订可能会增加支持)。请注意,匿名结构和未命名结构之间存在差异。
-
微软的编译器有(和 Windows 头文件使用)一个完全没有意义的东西,叫做匿名结构。这就是它接受该代码的原因。
标签: c++ c++11 unnamed-class