我想知道以下问题:_Alignas
C11 中的新对齐说明符是否适用于结构成员?
我一直假设这么多,但是对 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 )