结构成员与_Alignas对齐

rz0*_*rz0 6 c standards c11

我想知道以下内容:_AlignasC11中的新对齐说明符是否适用于结构成员?

我总是假设那么多,但是对N1570公共草案的全面阅读似乎表明,对齐指定符不能出现在说明符限定符列表中,如果它被支持的话,这是我期望的那样. .我已经阅读了几次语法,但无法弄清楚_Alignas结构成员声明中应该如何允许.

但是,在我看来,该标准的意图 _Alignas应该适用于结构成员,因为_Alignas(第6.7.5节)中的段落规定"在[......] a的声明中不应指明对齐属性.位字段".鉴于术语"位字段"在第6.7.2.1节中被定义为结构成员(精确的措辞:"这样的成员称为位字段 "),我总是将该句子解释为隐含意味着对齐说明符是允许非位字段成员.

检查现有实现表明,Clang 3.0和GCC 4.7都支持_Alignas结构成员而不抱怨(with -pedantic).Clang源代码从N1570再现相同的语法,除了Parser::ParseSpecifierQualifierList 允许对齐说明符; 该函数确实包含一个TODO元素,其内容如下:

/// TODO: diagnose attribute-specifiers and alignment-specifiers.
Run Code Online (Sandbox Code Playgroud)

GCC C解析器代码看似相似,即使它引用了标准语法,它允许在说明符限定符列表中使用对齐说明符.

我还检查了已知缺陷的列表,以及comp.lang.c和comp.std.c,以查看是否已在那里提出该主题,但似乎并非如此.因此,我的问题是:结构成员应该允许对齐说明符吗?

编辑:相关的语法规则是:

// Compare this...
(6.7) declaration-specifiers:
           storage-class-specifier declaration-specifiers_opt
           type-specifier declaration-specifiers_opt
           type-qualifier declaration-specifiers_opt
           function-specifier declaration-specifiers_opt
           // This seems to be the only place that mentions
           // alignment-specifier on the rhs of a rule.
           alignment-specifier declaration-specifiers_opt

(6.7.2.1) struct-or-union-specifier:
           struct-or-union identifier_opt { struct-declaration-list }
           struct-or-union identifier

(6.7.2.1) struct-declaration-list:
           struct-declaration
           struct-declaration-list struct-declaration

(6.7.2.1) struct-declaration:
           specifier-qualifier-list struct-declarator-list_opt ;
           static_assert-declaration

// ...to this.
(6.7.2.1) specifier-qualifier-list:
           type-specifier specifier-qualifier-list_opt
           type-qualifier specifier-qualifier-list_opt
           // Missing alignment-specifier specifier-qualifier-list_opt?

(6.7.5) alignment-specifier:
          _Alignas ( type-name )
          _Alignas ( constant-expression )
Run Code Online (Sandbox Code Playgroud)

Jen*_*edt 5

第6.7.5节,第6页明确规定这也涉及成员的一致性

声明的对象或成员的对齐要求被视为指定的对齐方式.

所以预期的语义就是那个.如果正如你所说,语法的正式规范错过了那一点(我没有检查),这是一个缺陷,你应该报告它.

编辑:在研究语法时,在我看来,alignment-specifier在案例中缺少6.7.2.1 中的补充specifier-qualifier-list,并且第14段中的文字解释也是有序的.