定义匿名结构是否合法?
Is it legal to define an anonymous struct?
以下代码是否合法?:
struct
{
int x;
};
这段代码只是定义了一个未命名的结构。我不打算创建这种类型的对象,也不需要以任何其他方式使用这种结构。它只是作为一些复杂的宏扩展的副作用出现在源代码中。
虽然没用,但我觉得没问题。只是另一段可以编译然后完全优化的代码。
然而,在现实世界中,结果与我的预期大相径庭:
GCC 8.3报错:
error: abstract declarator '<unnamed struct>' used as declaration
Clang 8.0.0也报错:
error: anonymous structs and classes must be class members
warning: declaration does not declare anything [-Wmissing-declarations]
只有 MSVC 2017 认为此类源没有问题。
所以,问题是:谁是对的?标准中是否有明确禁止此类声明的相关引用?
编辑:
该项目使用 C++11。但对于 C++98、C++11 和 C++17,错误消息是相同的。
不,这是不允许的。 GCC 和 Clang 是对的。
根据 [dcl.dcl]/3 (7 Declarations) in N3337 (C++11 final draft),一个 class 声明必须为程序引入一个名称。例如,以下是无效的:
enum { };
typedef class { };
(注意:这不是 C++11 独有的。在 N4140 (C++14 final draft) it is [dcl.dcl]/5 (7 Declarations). In N4659 (C++17 final draft) it is [dcl.dcl]/5 (10 Declarations) 中。)
以下代码是否合法?:
struct
{
int x;
};
这段代码只是定义了一个未命名的结构。我不打算创建这种类型的对象,也不需要以任何其他方式使用这种结构。它只是作为一些复杂的宏扩展的副作用出现在源代码中。
虽然没用,但我觉得没问题。只是另一段可以编译然后完全优化的代码。
然而,在现实世界中,结果与我的预期大相径庭:
GCC 8.3报错:
error: abstract declarator '<unnamed struct>' used as declaration
Clang 8.0.0也报错:
error: anonymous structs and classes must be class members
warning: declaration does not declare anything [-Wmissing-declarations]
只有 MSVC 2017 认为此类源没有问题。
所以,问题是:谁是对的?标准中是否有明确禁止此类声明的相关引用?
编辑:
该项目使用 C++11。但对于 C++98、C++11 和 C++17,错误消息是相同的。
不,这是不允许的。 GCC 和 Clang 是对的。
根据 [dcl.dcl]/3 (7 Declarations) in N3337 (C++11 final draft),一个 class 声明必须为程序引入一个名称。例如,以下是无效的:
enum { };
typedef class { };
(注意:这不是 C++11 独有的。在 N4140 (C++14 final draft) it is [dcl.dcl]/5 (7 Declarations). In N4659 (C++17 final draft) it is [dcl.dcl]/5 (10 Declarations) 中。)