例えば:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
C++では、パラメーターを/*...*/
コメントで囲むことができました。しかし、もちろんCでは、エラーerror: parameter name omitted
が発生します。
私は通常、次のようなマクロを作成します。
#define UNUSED(x) (void)(x)
未使用のすべてのパラメーターにこのマクロを使用できます。 (これはどのコンパイラでも機能することに注意してください。)
例えば:
void f(int x) {
UNUSED(x);
...
}
Gccでは、パラメーターに unused
属性 のラベルを付けることができます。
変数に付加されたこの属性は、変数がおそらく未使用であることを意味します。 GCCはこの変数に対して警告を生成しません。
実際には、これはパラメータの直前に__attribute__ ((unused))
を置くことで実現されます。例えば:
void foo(workerid_t workerId) { }
になる
void foo(__attribute__((unused)) workerid_t workerId) { }
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;
にフォールバックします
未使用の属性を持つgccの場合:
int foo (__attribute__((unused)) int bar) {
return 0;
}
これがgccとしてマークされていることを確認すると、コマンドラインスイッチWno-unused-parameter
を使用できます。
例えば:
gcc -Wno-unused-parameter test.c
もちろん、これはファイル全体に影響します(スイッチを設定した場所に応じてプロジェクトに影響する可能性があります)が、コードを変更する必要はありません。
属性のラベル付けは理想的な方法です。 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」と言います。
注:これは、最適化のためではなく、警告を抑制するためです。
ソースコードのブロックの未使用パラメーター警告を抑制するgcc/g ++固有の方法は、次のプラグマステートメントで囲むことです。
#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
同じ問題が発生しました。サードパートライブラリを使用しました。このライブラリをコンパイルすると、コンパイラ(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
が設定されていても、「未使用」の警告がすべて抑制されます。
この方法では、コードを変更する必要はありません。
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の意味を正確に言うことはできませんが、結果に影響を及ぼさないスーパーペダンティックな警告を抑制します。
私はこのスタイルが使用されているのを見ました:
if (when || who || format || data || len);