web-dev-qa-db-ja.com

関数の宣言または定義に[[多分未使用]]を付けますか?

C++ 17では属性 [[maybe_unused]] が導入されています。
これはGCCとClangの標準化されたバージョンだと思います: __ attribute __((unused))

警告を見たくない未使用の関数については、
属性を指定する必要があります

関数宣言?

void maybe_used_function() [[maybe_unused]];

または関数の定義?

void maybe_used_function() [[maybe_unused]] {
  /* impl */
}

いずれか一方?両方とも?
標準化された属性とコンパイラ固有の属性の両方で効果は同じですか?
配置動作と一般的な慣行についての明確なドキュメントが見つかりません。


定義の関数本体の前に属性を配置すると、GCCとclangでエラーが発生します。

void function();
int main(){}
void function() __attribute__((unused)) {}  

警告:GCCは、関数定義のこの位置で「未使用」属性を許可しません[-Wgcc-compat] void function()__ attribute __((unused)){


ただし、属性はエラーなしで他の2つの場所に配置できます。

__attribute__((unused)) void __attribute__((unused)) function() {}

たぶん、これらの方法の1つは、関数定義で属性を使用する方法です。

14
Trevor Hickey

N4606から、[dcl.attr.unused]¶4:

maybe_unused属性なしで宣言された名前またはエンティティは、後で属性を使用して再宣言できます。その逆も可能です。エンティティは、それをマークする最初の宣言の後にマークされていると見なされます。

関数定義は宣言([dcl.dcl]¶1)であるため、どちらの場所にも配置でき、同じように動作します。

(属性は実際には定義にのみ影響するため、両方の場所で許可することは理にかなっていますが、属性は自己文書化として機能できるため、宣言では許可でもあります。 。)

7
ildjarn

どちらでもない。に

[[attr1]] void [[attr2]] f [[attr3]] () [[attr4]] {}
  • attr1およびattr3f自体に関連(または適用)します。
  • attr2は、前述のタイプvoidに関連します。
  • attr4fのタイプに関連します( "関数()voidではなく、f)を返します。

あなたが欲しいmaybe_unusedfに関連付けられるため、位置1または3に配置できますが、2または4には配置できません。

@ ildjarnの答え 残りをカバーします。

GCCの__attribute__、ドキュメントを確認する必要があります。

22
T.C.