86

C++03 以前では、未使用のパラメーターに関するコンパイラの警告を無効にするために、通常、次のようなコードを使用します。

#define UNUSED(expr) do { (void)(expr); } while (0)

例えば

int main(int argc, char *argv[])
{
    UNUSED(argc);
    UNUSED(argv);

    return 0;
}

ただし、マクロは C++ のベスト プラクティスではありません。C ++ 11標準でより良い解決策が表示されますか? つまり、マクロを削除できますか?

全てに感謝!

4

12 に答える 12

212

パラメータ名は省略できます。

int main(int, char *[])
{

    return 0;
}

また、main の場合は、パラメーターを完全に省略することもできます。

int main()
{
    // no return implies return 0;
}

C++11 標準の「§ 3.6 開始と終了」を参照してください。

于 2013-04-02T12:19:26.373 に答える
38

この警告を「無効」にするには、引数を書くのを避け、型だけを書くのが最善です。

void function( int, int )
{
}

または、必要に応じてコメントアウトします。

void function( int /*a*/, int /*b*/ )
{
}

名前付き引数と名前なし引数を混在させることができます:

void function( int a, int /*b*/ )
{
}

C++17では、次のような [[maybe_unused]] 属性指定子があります。

void function( [[maybe_unused]] int a, [[maybe_unused]] int b )
{
}
于 2013-04-03T11:41:10.970 に答える
29

同等のものはありません。

したがって、同じ古いオプションにこだわっています。パラメータリストの名前を完全に省略してもよろしいですか?

int main(int, char**)

の特定のケースでmainは、もちろん、パラメーター自体を単純に省略できます。

int main()

GCC の など、典型的な実装固有のトリックもあります__attribute__((unused))

于 2013-04-02T12:20:12.473 に答える
14

古くて標準的な方法に対して何を持っていますか?

void f(int a, int b)
{
  (void)a;
  (void)b;
  return;
}
于 2013-04-02T18:11:48.960 に答える
14

マクロは理想的ではないかもしれませんが、この特定の目的には適しています。マクロの使用に固執すると思います。

于 2013-04-02T12:24:23.867 に答える
11

新しく入手できるものはありません。

私にとって最も効果的なのは、実装でパラメーター名をコメントアウトすることです。そうすれば、警告を取り除くことができますが、パラメーターが何であるかについての概念は保持されます (名前が使用可能であるため)。

マクロ (および他のすべてのキャストから void へのアプローチ) には、マクロの使用後にパラメーターを実際に使用できるという欠点があります。これにより、コードの保守が難しくなる可能性があります。

于 2013-04-02T12:29:14.783 に答える
0

コードのタイム クリティカルなセグメントを独自に実装しています。私はスローダウンのためにタイムクリティカルなコードをしばらく研究してきましたが、この実装は最適化されたタイムクリティカルなコードから約2%を消費することがわかりました:

#define UTILITY_UNUSED(exp) (void)(exp)
#define UTILITY_UNUSED2(e0, e1) UTILITY_UNUSED(e0); UTILITY_UNUSED(e1)
#define ASSERT_EQ(v1, v2) { UTILITY_UNUSED2(v1, v2); } (void)0

タイムクリティカルなコードはASSERT*デバッグ目的で定義を使用しましたが、リリースでは明らかに削除されていますが...これは で少し高速なコードを生成するようですVisual Studio 2015 Update 3:

#define UTILITY_UNUSED(exp) (void)(false ? (false ? ((void)(exp)) : (void)0) : (void)0)
#define UTILITY_UNUSED2(e0, e1) (void)(false ? (false ? ((void)(e0), (void)(e1)) : (void)0) : (void)0)

その理由は二重false ?表現にあります。どういうわけか、最大限に最適化されたリリースで少し高速なコードを生成します。

なぜこれが高速なのかはわかりませんが (コンパイラーの最適化のバグのようです)、少なくともそのコードの場合のより良い解決策です。

: ここで最も重要なことは、上記のアサーションやリリースで未使用のマクロがないと、タイム クリティカルなコードの速度が低下することです。つまり、doublefalse ?式は驚くほどコードの最適化に役立ちます。

于 2017-10-19T18:20:51.490 に答える
-2

windows.hUNREFERENCED_PARAMETERを定義します。

#define UNREFERENCED_PARAMETER(P) {(P) = (P);}

したがって、次のようにすることができます。

#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
  UNREFERENCED_PARAMETER(argc);
  puts(argv[1]);
  return 0;
}

または Windows 以外の場合:

#include <stdio.h>
#define UNREFERENCED_PARAMETER(P) {(P) = (P);}
int main(int argc, char **argv) {
  UNREFERENCED_PARAMETER(argc);
  puts(argv[1]);
  return 0;
}
于 2016-02-04T04:52:42.950 に答える