结构成员与_Alignas对齐

时间:2012-05-20 20:12:15

标签: c standards c11

我想知道以下内容:是新的_Alignas对齐方式 C11中的说明符适用于结构成员吗?

我总是假设那么多,但是对N1570的全面阅读 公共草案似乎表明 alignment-specifier 不能 出现在说明符 - 限定符列表中,这是我所期望的 如果得到支持的话。我已经读过几次语法了 但无法弄清楚应该如何允许_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 )

1 个答案:

答案 0 :(得分:5)

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

  

采用声明的对象或成员的对齐要求   是指定的对齐方式。

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

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