我想知道以下几点:在新的_Alignas
在C11对齐方式说明适用于结构体成员?
我一直认为多,但N1570公开草案进行彻底的阅读似乎表明, 对齐说明符不能出现在一个符限定符列表中 ,这是我希望它是,如果它支持。 我读过语法几次,但无法弄清楚如何_Alignas
应该在结构成员声明被允许。
然而,在我看来,该标准的目的是_Alignas
应适用于结构成员的段落_Alignas
(第6.7.5)指出,“对齐属性不得在[声明中指定... ]位字段”。 鉴于“位字段”一词在§6.7.2.1被定义为一个结构成员(准确的措词:“这样的成员称为位域 ”),我一直理解这句话隐含的意思是定位符分别为允许非位字段成员。
检查对现有实现表明,无论锵3.0和4.7 GCC支撑_Alignas
上结构构件而不抱怨(与-pedantic
)。 铛源代码再现该语法从N1570,除了Parser::ParseSpecifierQualifierList
允许对准说明符; 该函数包含TODO元素,不过,内容如下:
/// TODO: diagnose attribute-specifiers and alignment-specifiers.
海湾合作委员会ç解析器代码看起来是相似的,即即使它引用的标准语法,它允许定位符的说明符限定符列表。
我还检查了已知的缺陷列表,以及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 )