6

私は次のことについて疑問に思っていました:_AlignasC11の新しいアライメント指定子は構造体メンバーに適用できますか?

私はいつもそれだけを想定していましたが、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 )
4

1 に答える 1

5

セクション6.7.5、p 6は、これがメンバーの調整にも関係することを明確に指定しています

宣言されたオブジェクトまたはメンバーの配置要件は、指定された配置と見なされます。

したがって、意図されたセマンティクスはそれです。あなたが言うように、文法の正式な仕様がそのビットを見逃している場合(私はチェックしませんでした)、これは欠陥であり、あなたはそれを報告する必要があります。

編集:文法を見るとalignment-specifier、6.7.2.1の追加がの場合に欠落しているように見えます。またspecifier-qualifier-list、パラ14のテキストによる説明が適切であるように思われます。

于 2012-05-20T20:45:00.307 に答える