私は次のことについて疑問に思っていました:_Alignas
C11の新しいアライメント指定子は構造体メンバーに適用できますか?
私はいつもそれだけを想定していましたが、N1570の公開ドラフトをよく読んだことは、アライメント指定子が指定子修飾子リストに表示されないことを示しているようです。 。_Alignas
文法を数回読みましたが、構造体のメンバー宣言でどのように許可されるのか理解できません。
ただし、 (§6.7.5)の段落で「[...]の宣言でアライメント属性を指定してはならない」と述べられているため、この規格の目的は
_Alignas
構造体のメンバーに適用できるようにすることであるように思われます。_Alignas
ビットフィールド」。「ビットフィールド」という用語が§6.7.2.1で構造体メンバーとして定義されていることを考えると(正確な言い回し:「そのようなメンバーはビットフィールドと呼ばれます」)、私は常にその文を暗黙的にアラインメント指定子を意味すると解釈していました非ビットフィールドメンバーに許可されます。
既存の実装と照合すると、Clang3.0とGCC4.7の両方が、_Alignas
文句を言わずに構造体メンバーをサポートしていることがわかります(with -pedantic
)。Parser::ParseSpecifierQualifierList
Clangソースコードは、アライメント指定子を許可することを除いて、N1570と同じ文法を再現します。ただし、この関数には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 )