2016-07-21 2 views
10

C++ 17は、属性[[maybe_unused]]を導入しています。
私はこれをGCCとClangの標準化バージョン:__attribute__((unused))と仮定します。私はからの警告を表示したくない未使用の関数について関数の宣言や定義に[[多分未使用]]を入れますか?


は私が

関数宣言に属性を指定する必要がありますか?

void maybe_used_function() [[maybe_unused]]; 

または関数定義?

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

いずれか?どちらも?
標準化された属性とコンパイラ固有の属性の両方で効果が同じになるのでしょうか?
プレースメントの動作、および一般的なプラクティスについての明確なドキュメントは見つかりません。

私は定義における関数本体の前に属性を配置すると、GCCと打ち鳴らすがエラーを与える

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

警告:GCCがこの位置に「未使用」属性を許可していません に関数定義[-Wgcc-COMPAT] ボイド関数()__attribute __()(未使用){


しかし、属性がエラーなしで二つの他の場所に置くことができます。

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

たぶん、次のいずれかの方法は、私は関数定義の属性を使用すると期待していますどのようにでしょうか? N4606から

+0

*試してみましたが、コンパイラが実際に言っていることを見ましたか? AFAIK、属性は宣言*のみ*になりますが、標準テキストをダブルチェックしませんでした。 –

+0

@JesperJuhl:この場合、コンパイラは間違っています。特に、正しく実装されていても実装されていない可能性がある_upcoming_言語機能について議論するときは、これは珍しいことではありません。 – ildjarn

+0

@ildjarn GCCエラーは '[[maybe_unused]]ではなく' __attribute __((未使用)) 'から発生しました。 Clangも同じことをしているようだ。 –

答えて

5

、[dcl.attr.unused]¶4:

A name or entity declared without the maybe_unused attribute can later be redeclared with the attribute and vice versa. An entity is considered marked after the first declaration that marks it.

関数定義は宣言([dcl.dcl]¶1)であるので、これはあなたがいずれかの場所に置くことができることを意味同じように動作します。

(属性だけで、実際に定義に影響を与えますので、それは両方の場所で許可されることは理にかなっていますが、属性は、それはまた宣言にを許可されている自己のドキュメントとしての役割を果たすことができますので。)

19

いずれも

[[attr1]] void [[attr2]] f [[attr3]]() [[attr4]] {} 
  • attr1attr3 appertain

    で(または適用)自体fします。
  • attr2は、前述のタイプのもの、voidです。fのタイプ(voidを返す()する」機能)、ないf

あなたはmaybe_unusedfにappertainしたいので、あなたは、位置1または3にそれを置くことができますが、ない2から

  • attr4 appertainsまたは4.

    @ildjarn's answerは残りをカバーしています。GCCの__attribute__については

    、あなたがそのドキュメントをチェックする必要があります。

  • 関連する問題