【问题标题】:Is it legal to define an unnamed struct?定义一个未命名的结构是否合法?
【发布时间】: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 的错误信息是一样的。

【问题讨论】:

标签: c++ c++11 unnamed-class


【解决方案1】:

不,这是不允许的。 GCC 和 Clang 是对的。

根据N3337 (C++11 final draft) 中的[dcl.dcl]/3 (7 Declarations),类声明必须在程序中引入一个名称。例如,以下是无效的:

enum { };
typedef class { }; 

(注意:这不是 C++11 独有的。在 N4140 (C++14 final draft) 中是 [dcl.dcl]/5 (7 Declarations)。在 N4659(C++17 最终草案)中是 [dcl.dcl]/5 (10 Declarations)。)

【讨论】:

  • 问题标记为 c++11,N3337 的措辞不存在
  • @StoryTeller 在N3337中是[dcl.dcl]/3
  • 是的,C++11 是我最关心的问题。但是,无论我是否添加编译器选项-std=c++11,错误消息都是相同的。
  • struct { int n; };不介绍名字::<anonymous struct>::n吗?
  • @YSC - 是的,在类的范围内,名称可以指代成员。您需要完全限定它的事实意味着它根本没有引入该名称。这是关于声明性区域和范围的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2013-12-17
  • 2018-07-11
  • 1970-01-01
  • 2019-10-09
  • 2021-03-21
相关资源
最近更新 更多