Attribute specifier sequence (since C23)
型、オブジェクト、式などに対する実装定義の属性を導入します。
目次 |
構文
-
[[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 ).
説明
属性は、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)
|
この属性で宣言された名前またはエンティティの使用が許可されているが、何らかの
理由
により推奨されないことを示す
(属性指定子) |
[[
fallthrough
]]
(C23)
|
前のcaseラベルからのフォールスルーが意図的であり、フォールスルーについて警告するコンパイラによって診断されるべきではないことを示す
(属性指定子) |
|
戻り値が破棄された場合にコンパイラが警告を発行するよう促す
(属性指定子) |
|
[[
maybe_unused
]]
(C23)
|
未使用エンティティに関するコンパイラの警告を抑制する(存在する場合)
(属性指定子) |
|
関数が戻らないことを示す
(属性指定子) |
|
[[
unsequenced
]]
(C23)
|
関数がステートレス、副作用なし、冪等性があり、独立していることを示す
(属性指定子) |
[[
reproducible
]]
(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における属性 |