定义匿名结构体是否合法?

16

以下代码是否合法?:

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的错误消息都是相同的。


1
根据 https://dev59.com/63E95IYBdhLWcg3wkeuq#12785369 ,C++ 不允许匿名结构体(但它表示 C11 允许,并且未来的 C++ 版本可能会添加支持)。请注意,匿名结构体和无名结构体之间存在差异。 - simon
http://www.cplusplus.com/forum/general/138733/ - Mayur
https://dev59.com/63E95IYBdhLWcg3wkeuq - VLL
微软的编译器有一个完全无意义的东西,叫做匿名结构体(anonymous struct),而Windows头文件使用了这个东西。这就是为什么它接受那段代码的原因。 - Pete Becker
这个问题混淆了匿名结构体和未命名的结构体。标题是关于未命名的结构体,但你的示例是一个匿名结构体。匿名结构体只存在于C语言中。未命名的结构体是合法的C++语法。 - leetNightshade
1个回答

15

2
@StoryTeller 在 N3337 中,它是[dcl.dcl]/3。 - VLL
1
struct { int n; }; 不是引入了 ::<anonymous struct>::n 这个名称吗? - YSC
3
是的,在类的范围内,一个名称可能指代一个成员。需要完全限定它的事实意味着它根本没有引入该名称。这涉及到声明性区域和作用域。 - StoryTeller - Unslander Monica
@StoryTeller 我需要学习更多。谢谢,我会查看的。 - YSC
当前问题是关于“未命名结构体”,而不是“匿名结构体”。根据当前问题,你的回答是错误/不完整的。如果我们可以编辑并将问题重命名为匿名结构体,那么你的回答就是正确的。 - leetNightshade
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接