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

2010年08月30日に質問されました。  ·  閲覧回数 181.9k回  ·  ソース

nixgadget picture
2010年08月30日

例えば:

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

C ++では、パラメーターの前後に/*...*/コメントを付けることができました。 しかし、もちろんCでは、エラーerror: parameter name omittedます。

回答

Job picture
2010年08月30日
313

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

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

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

例えば:

void f(int x) {
    UNUSED(x);
    ...
}
Philip Potter picture
2010年08月30日
113

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

変数に付加されたこの属性は、変数がおそらく未使用で

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

void foo(workerid_t workerId) { }

になります

void foo(__attribute__((unused)) workerid_t workerId) { }
ideasman42 picture
2012年10月15日
62

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

#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]ような引数がある場合は、実行できません。
float UNUSED((*coords)[3])またはfloat (*UNUSED(coords))[3] 、これは私がこれまでに見つけたUNUSEDマクロの唯一の欠点です。これらの場合、私は(void)coords;にフォールバックします。

Teddy picture
2013年12月20日
19

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

int foo (__attribute__((unused)) int bar) {
    return 0;
}
Paul Hutchinson picture
2018年07月04日
17

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

例えば:

gcc -Wno-unused-parameter test.c

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

Calm picture
2016年08月27日
9

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

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
user2452561 picture
2014年03月01日
5

属性にラベルを付けるのが理想的な方法です。 マクロは時々混乱を招きます。 そして、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 setbt未使用」と言います。

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

landerlyoung picture
2015年01月20日
4

同じ問題が発生しました。 サードパーティのライブラリを使用しました。 このライブラリをコンパイルすると、コンパイラ(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設定されている場合でも、すべての「未使用」警告が抑制されます。

このように、コードを変更する必要はありません。

Bwana The Master picture
2017年03月16日
1

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の正確な意味はわかりませんが、結果に影響を与えない過剰な警告を抑制します。

Iustin picture
2010年08月30日
0

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

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