web-dev-qa-db-ja.com

gccのC ++ 11スタイルの[[unused]]属性?

Gcc/g ++ 4.9では、次のように記述できます。

int x __attribute__((unused)) = f();

xが意図的に未使用であることを示します。

C++ 11 [[]]属性表記でこれをどうにかして可能ですか?

私は試した:

int x [[unused]] = f();

しかし、それは機能しません。

(はい、実装で定義された属性であることを知っています。)

19
Andrew Tomazos

はい、_[[gnu::unused]]_を使用します

すでに述べたように、unusedは、標準で指定されている 標準属性 の一部ではありません。

標準では、___attribute___および___declspec_のような実装定義の属性も新しい構文で使用できます。コンパイラーが属性(例としてMSVCでコンパイルするときのgcc属性)を認識しない場合は、単に無視されます。 (おそらく警告付き)

Gccの場合、gnuプレフィックスとC++ 11属性構文を使用できます。__attribute__((unused))の代わりに_[[gnu::unused]]_は、他のgcc属性にも同じように適用する必要があります。

GNUプレフィックスのない例

GNUプレフィックスの例

18
user1942027

有る [[maybe_unused]] C++ 17の属性。これはGCC 7で実装されています。 GCCでのC++標準のサポート を参照してください。

P0212R1プロポーザルの例

[[maybe_unused]] void f([[maybe_unused]] bool thing1,
                        [[maybe_unused]] bool thing2) {
    [[maybe_unused]] bool b = thing1 && thing2;
    assert(b);
}
13
Alan Kazbekov

あなたが参照しているものは 属性指定子 として知られています。これは、プラットフォームに依存するさまざまな指定子を標準化する試みです。

添付のドキュメントリンクで確認できるように、C++ 11でサポートされている指定子は次のとおりです。

  • _[[noreturn]]_
  • _[[carries_dependency]]_

c ++ 14では:

  • _[[deprecated]]_(次の形式でもサポートされます:[[deprecated("reason")]]

したがって、答えは次のとおりです。いいえ、C++ 11機能のみを使用することはできません


ポータブルソリューションにonlyに興味がない場合は、方法があるかもしれません。 C++標準はこのリストを制限しません。

C++標準では、次の属性のみが定義されています。 他のすべての属性は実装固有です。

さまざまなコンパイラーが一部の非標準指定子をサポートできます。たとえば、Clangがサポートしていることを確認するために このページ を読むことができます。

  • _[[gnu::unused]]_

おそらく、GCCのバージョンもこの指定子をサポートしています。 このページ には、一般化された属性のサポートに関するバグレポートが含まれています。 _[[gnu::unused]]_についても説明します。

10
Mateusz Grzejek