属性指定子シーケンス(C23 以降)
型、オブジェクト、式などのための実装定義属性を導入します。
目次 |
[編集] 構文
[[attr ]][[attr1, attr2, attr3(args)]][[attribute-prefix::attr (args)]]
形式的には、構文は次のようになります。
[[ attribute-list ]] |
(C23以降) | ||||||||
attribute-list は、ゼロ個以上の attribute-token のカンマ区切りシーケンスです。
| standard-attribute | (1) | ||||||||
attribute-prefix :: identifier |
(2) | ||||||||
standard-attribute ( argument-list (オプション) ) |
(3) | ||||||||
attribute-prefix :: identifier ( argument-list (オプション) ) |
(4) | ||||||||
attribute-prefix は identifier であり、argument-list は括弧、角括弧、波括弧がバランスの取れたトークンのシーケンス (balanced-token-sequence) です。
[編集] 説明
属性は、GNUやIBMの言語拡張機能 `__attribute__((...))`、Microsoftの拡張機能 `__declspec()` など、実装定義の言語拡張機能に対する統一された標準構文を提供します。
属性は、Cプログラムのほぼどこでも使用でき、型、変数、関数、名前、コードブロック、翻訳単位全体など、ほぼすべてのものに適用できます。ただし、各属性は、実装で許可されている場所にのみ有効です。例えば、`[[expect_true]]` は `if` 文でのみ使用でき、クラス宣言では使用できない属性かもしれません。`[[omp::parallel()]]` はコードブロックまたは `for` ループに適用できる属性かもしれませんが、`int` 型には適用できないかもしれません(これらの2つの属性は架空の例です。標準属性および一部の非標準属性については以下を参照してください)。
宣言において、属性は宣言全体の前にも、宣言されたエンティティの名前の直後にも現れることができ、その場合、それらは結合されます。ほとんどのその他の状況では、属性は直前のエンティティに適用されます。
2つの連続した左角括弧トークン (`[[`) は、属性指定子を導入するとき、または属性引数の内部でのみ現れることができます。
以下にリストされている標準属性に加えて、実装は実装定義の動作を持つ任意の非標準属性をサポートする場合があります。実装で認識されないすべての属性は、エラーを引き起こすことなく無視されます。
すべての standard-attribute は標準化のために予約されています。つまり、すべての非標準属性は、実装によって提供される attribute-prefix でプレフィックスが付けられます。例: `[[gnu::may_alias]]` および `[[clang::no_sanitize]]`。
[編集] 標準属性
C標準で定義されている属性は次のとおりです。 `attr` の形式の名前を持つすべての標準属性は、`__attr__` としても表記でき、その意味は変更されません。
[[deprecated]](C23)[[deprecated("reason")]](C23){{{notes}}} |
この属性で宣言された名前またはエンティティの使用が許可されているが、何らかの reason のために推奨されないことを示します。 (属性指定子) |
[[fallthrough]](C23) |
前のケースラベルからのフォールスルーが意図的なものであり、フォールスルーについて警告するコンパイラによって診断されるべきではないことを示します (属性指定子) |
| 戻り値が破棄された場合にコンパイラが警告を発するように促します。 (属性指定子) | |
[[maybe_unused]](C23) |
未使用のエンティティに対するコンパイラ警告を抑制します(もしあれば)。 (属性指定子) |
| 関数が戻らないことを示します (属性指定子) | |
[[unsequenced]](C23) |
関数がステートレス、効果なし、冪等、かつ独立していることを示します。 (属性指定子) |
[[reproducible]](C23) |
関数が効果なしで冪等であることを示します。 (属性指定子) |
[編集] 属性テスト
__has_c_attribute( attribute-token ) |
|||||||||
attribute-token で名前が付けられた属性トークンの存在をチェックします。
標準属性の場合、属性がワーキングドラフトに追加された年と月(以下の表を参照)に展開されます。ベンダー固有の属性の存在は、ゼロ以外の整数定数によって決定されます。
__has_c_attribute は、`#if` および `#elif` の条件式の展開に使用できます。`#ifdef`、`#ifndef`、および `defined` によって定義されたマクロとして扱われますが、それ以外の場所では使用できません。
| attribute-token | 属性 | 値 | 標準 |
|---|---|---|---|
deprecated
|
[[deprecated]]
|
201904L | (C23) |
fallthrough
|
[[fallthrough]]
|
201904L | (C23) |
maybe_unused
|
[[maybe_unused]]
|
201904L | (C23) |
nodiscard
|
[[nodiscard]]
|
202003L | (C23) |
noreturn_Noreturn
|
[[noreturn]][[_Noreturn]]
|
202202L | (C23) |
unsequenced
|
[[unsequenced]]
|
202207L | (C23) |
reproducible
|
[[reproducible]]
|
202207L | (C23) |
[編集] 例
[[gnu::hot]] [[gnu::const]] [[nodiscard]] int f(void); // declare f with three attributes [[gnu::const, gnu::hot, nodiscard]] int f(void); // the same as above, but uses a single attr // specifier that contains three attributes int f(void) { return 0; } int main(void) { }
[編集] 参照
- C23標準 (ISO/IEC 9899:2024)
- 6.7.12 Attributes (p: TBD)
[編集] 関連項目
| C++ のドキュメント (属性指定子シーケンス について)
|
[編集] 外部リンク
| 1. | GCC における属性 |
| 2. | Clang における属性 |