6

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

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

但是,在我看来,该标准的意图是 _Alignas应该适用于结构成员,因为_Alignas(第 6.7.5 节)的段落指出“对齐属性不应在 [...] 的声明中指定位域”。鉴于术语“位域”在第 6.7.2.1 节中定义为结构成员(准确的措辞:“这样的成员称为位域”),我一直将这句话解释为隐含地表示对齐说明符是允许非位域成员。

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

/// TODO: diagnose attribute-specifiers and alignment-specifiers.

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 )
4

1 回答 1

5

第 6.7.5 节,第 6 页,明确指出这也涉及成员的对齐

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

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

编辑:查看语法,在我看来,alignment-specifier在 6.7.2.1 的情况下缺少添加specifier-qualifier-list,并且第 14 段中的文字解释是有序的。

于 2012-05-20T20:45:00.307 回答