我想知道以下内容:是新的_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 )
答案 0 :(得分:5)
第6.7.5节,第6页,明确规定这也涉及成员的对齐
采用声明的对象或成员的对齐要求 是指定的对齐方式。
所以预期的语义就是那个。如果正如你所说,语法的正式规范错过了那一点(我没有检查),这是一个缺陷,你应该报告它。
修改:查看语法,在我看来,在alignment-specifier
的情况下,在6.7.2.1中添加了specifier-qualifier-list
,并且第14段中的文字解释将是有序的。