Namespaces
Variants

Attribute specifier sequence (since C23)

From cppreference.net

型、オブジェクト、式などに対する実装定義の属性を導入します。

目次

**翻訳の説明:** - 「Contents」を「目次」に翻訳しました - その他のテキスト(Syntax、Explanation、Standard attributesなど)はC++関連の専門用語として翻訳せず、原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどはすべて変更せず保持しました - 番号部分(tocnumber)はそのまま保持しました

構文

[[ attr  ]] [[ attr1 , attr2 , attr3 ( args ) ]] [[ attribute-prefix :: attr  ( args ) ]]

形式的には、構文は以下の通りです

[[ 属性リスト ]] (C23以降)

where attribute-list is a comma-separated sequence of zero or more attribute-token s

standard-attribute (1)
attribute-prefix :: identifier (2)
standard-attribute ( argument-list  (オプション) ) (3)
attribute-prefix :: identifier ( argument-list  (オプション) ) (4)

where attribute-prefix is an identifier and argument-list is a sequence of tokens where parentheses, brackets and braces are balanced ( balanced-token-sequence ).

1) 標準属性、例えば [ [ fallthrough ] ]
2) 名前空間を持つ属性、例えば [ [ gnu :: unused ] ]
3) 引数付き標準属性、例えば [ [ deprecated ( "reason" ) ] ]
4) 名前空間と引数リストの両方を持つ属性、例えば [ [ gnu :: nonnull ( 1 ) ] ]

説明

属性は、GNUやIBMの言語拡張 __attribute__((...)) やMicrosoft拡張 __declspec() など、実装定義の言語拡張に対する統一された標準構文を提供します。

属性はC++プログラムのほぼあらゆる場所で使用でき、ほぼすべての要素に適用できます:型、変数、関数、名前、コードブロック、翻訳単位全体などですが、各特定の属性は実装によって許可された場所でのみ有効です: [[expect_true]] if 文でのみ使用可能で、クラス宣言では使用できない属性である可能性があります。 [[omp::parallel()]] はコードブロックや for ループに適用可能ですが、 int 型などには適用できない属性である可能性があります(これらの2つの属性は架空の例であり、標準およびいくつかの非標準属性については以下を参照してください)

宣言において、属性は宣言全体の前に現れることも、宣言されるエンティティの名前の直後に現れることもあり、その場合それらは結合されます。他のほとんどの状況では、属性は直前のエンティティに適用されます。

2つの連続する左大括弧トークン ( [[ ) は、attribute-specifier を導入する場合、または attribute argument 内でのみ使用できます。

以下の標準属性に加えて、実装は実装定義の動作を持つ任意の非標準属性をサポートする場合があります。実装に未知なすべての属性は、エラーを引き起こすことなく無視されます。

すべての standard-attribute は標準化のために予約されています。つまり、すべての非標準属性は実装によって提供される attribute-prefix が前置されます。例えば [[gnu::may_alias]] [[clang::no_sanitize]] などです。

標準属性

C標準によって定義される属性は以下のみです。標準属性のうち名前が attr の形式を持つものはすべて __attr__ と記述することもでき、その意味は変更されません。

[[ deprecated ]] (C23) [[ deprecated (" reason ")]] (C23)
この属性で宣言された名前またはエンティティの使用が許可されているが、何らかの 理由 により推奨されないことを示す
(属性指定子)
(C23)
前のcaseラベルからのフォールスルーが意図的であり、フォールスルーについて警告するコンパイラによって診断されるべきではないことを示す
(属性指定子)
[[ nodiscard ]] (C23) [[ nodiscard (" reason ")]] (C23)
戻り値が破棄された場合にコンパイラが警告を発行するよう促す
(属性指定子)
(C23)
未使用エンティティに関するコンパイラの警告を抑制する(存在する場合)
(属性指定子)
[[ noreturn ]] (C23) [[ _Noreturn ]] (C23) (deprecated)
関数が戻らないことを示す
(属性指定子)
(C23)
関数がステートレス、副作用なし、冪等性があり、独立していることを示す
(属性指定子)
(C23)
関数が副作用なしで冪等性があることを示す
(属性指定子)

属性テスト

__has_c_attribute( 属性トークン )

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); // 3つの属性を持つfを宣言
[[gnu::const, gnu::hot, nodiscard]]
int f(void); // 上記と同じだが、3つの属性を含む
             // 単一の属性指定子を使用
int f(void) { return 0; }
int main(void)
{
}

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 6.7.12 属性 (p: 未定)

関連項目

C++ ドキュメント for 属性指定子シーケンス

外部リンク

1. GCCにおける属性
2. Clangにおける属性