web-dev-qa-db-ja.com

Cで「未使用のパラメータ」警告を抑制する方法は?

例えば:

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}

C++では、パラメーターを/*...*/コメントで囲むことができました。しかし、もちろんCでは、エラーerror: parameter name omittedが発生します。

187
nixgadgets

私は通常、次のようなマクロを作成します。

#define UNUSED(x) (void)(x)

未使用のすべてのパラメーターにこのマクロを使用できます。 (これはどのコンパイラでも機能することに注意してください。)

例えば:

void f(int x) {
    UNUSED(x);
    ...
}
267
Job

Gccでは、パラメーターに unused属性 のラベルを付けることができます。

変数に付加されたこの属性は、変数がおそらく未使用であることを意味します。 GCCはこの変数に対して警告を生成しません。

実際には、これはパラメータの直前に__attribute__ ((unused))を置くことで実現されます。例えば:

void foo(workerid_t workerId) { }

になる

void foo(__attribute__((unused)) workerid_t workerId) { }
92
Philip Potter

Gcc/clangの未使用の属性を使用できますが、これらのマクロをヘッダーで使用して、ソース全体にgcc固有の属性が含まれないようにします。また、__attribute__がすべて冗長でbitいです。

#ifdef __GNUC__
#  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
#  define UNUSED(x) UNUSED_ ## x
#endif

#ifdef __GNUC__
#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
#  define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif

その後、次のことができます...

void foo(int UNUSED(bar)) { ... }

コード内でbarを使用しようとするとエラーが発生し、誤って属性を残しておくことができないため、これが好ましいです

および機能用...

static void UNUSED_FUNCTION(foo)(int bar) { ... }

注1):
私の知る限り、MSVCには__attribute__((__unused__))に相当するものがありません。

注2):
UNUSEDマクロは、括弧を含む引数では機能しません。
したがって、float (*coords)[3]のような引数がある場合は、できない do、
float UNUSED((*coords)[3])またはfloat (*UNUSED(coords))[3]、これは私がこれまで見つけたUNUSEDマクロの唯一の欠点であり、これらのケースでは(void)coords;にフォールバックします

54
ideasman42

未使用の属性を持つgccの場合:

int foo (__attribute__((unused)) int bar) {
    return 0;
}
16
Teddy

これがgccとしてマークされていることを確認すると、コマンドラインスイッチWno-unused-parameterを使用できます。

例えば:

gcc -Wno-unused-parameter test.c

もちろん、これはファイル全体に影響します(スイッチを設定した場所に応じてプロジェクトに影響する可能性があります)が、コードを変更する必要はありません。

8
Paul Hutchinson

属性のラベル付けは理想的な方法です。 MACROはいつか混乱を招きます。また、void(x)を使用して、処理にオーバーヘッドを追加しています。

入力引数を使用しない場合は、使用します

void foo(int __attribute__((unused))key)
{
}

関数内で定義された変数を使用しない場合

void foo(int key)
{
   int hash = 0;
   int bkt __attribute__((unused)) = 0;

   api_call(x, hash, bkt);
}

後でロジックにハッシュ変数を使用しますが、bktは必要ありません。未使用としてbktを定義します。そうでない場合、コンパイラは「bkt set bt not used」と言います。

注:これは、最適化のためではなく、警告を抑制するためです。

5
user2452561

ソースコードのブロックの未使用パラメーター警告を抑制するgcc/g ++固有の方法は、次のプラグマステートメントで囲むことです。

#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
5
Calm

同じ問題が発生しました。サードパートライブラリを使用しました。このライブラリをコンパイルすると、コンパイラ(gcc/clang)が未使用の変数について文句を言います。

このような

test.cpp:29:11:警告:変数 'magic'は設定されていますが使用されていません[-Wunused-but-set-variable] short magic [] = {

test.cpp:84:17:警告:未使用変数 'before_write' [-Wunused-variable] int64_t before_write = Thread :: currentTimeMillis();

したがって、解決策は非常に明確です。 -Wno-unusedをgcc/clang CFLAGとして追加すると、-Wallが設定されていても、「未使用」の警告がすべて抑制されます。

この方法では、コードを変更する必要はありません。

3
landerlyoung

MSVCで特定の警告を抑制するには、コンパイラの番号を/ wd#として指定するだけで十分です。私のCMakeLists.txtには次のようなブロックが含まれています。

If (MSVC)
    Set (CMAKE_EXE_LINKER_FLAGS "$ {CMAKE_EXE_LINKER_FLAGS} / NODEFAULTLIB: LIBCMT")
    Add_definitions (/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
    Add_definitions (/D_CRT_SECURE_NO_WARNINGS)
Elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
    Add_definitions (-Wall -W -pedantic)
Else ()
    Message ("Unknown compiler")
Endif ()

私は3年間MSVCに注意を払っていないため、/ wd4512/wd4702/wd4100/wd4510/wd4355/wd4127の意味を正確に言うことはできませんが、結果に影響を及ぼさないスーパーペダンティックな警告を抑制します。

1

私はこのスタイルが使用されているのを見ました:

if (when || who || format || data || len);
0
Iustin