C中的“未使用参数”警告

在C代码中抑制未使用的参数警告的最好方法是什么?

例如,

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

在C ++中,我能够在参数中join/*...*/注释。 但当然不是C

它给我error: parameter name omitted

我通常写这样一个macros:

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

你可以使用这个macros来处理所有未使用的参数。 (请注意,这适用于任何编译器。)

例如:

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

在gcc中,你可以unused属性来标记参数。

该属性附加到一个variables,意味着该variables可能未被使用。 海湾合作委员会不会产生这个变数的警告。

实际上,这是通过在参数后面放置__attribute__ ((unused))来实现的。 例如

 auto lambda = [](workerid_t workerId) -> void { }; 

 auto lambda = [](__attribute__((unused)) _workerid_t workerId) -> void { } ; 

你可以使用gcc / clang的未使用的属性,但是我在头文件中使用了这些macros,以避免在源代码中使用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 ,你会得到一个错误,所以你不能错误的离开属性。

和function…

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

注1):
据我所知,MSVC没有等效于__attribute__((__unused__))

笔记2):
UNUSEDmacros不适用于包含括号的参数,
所以如果你有像float (*coords)[3]这样的参数float (*coords)[3]不能这样做,
float UNUSED((*coords)[3])float (*UNUSED(coords))[3] ,这是我发现的UNUSEDmacros的唯一缺点,在这种情况下(void)coords;

用gcc与未使用的属性:

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

标记属性是理想的方法。 MACRO导致混乱。 并通过使用void(x),我们正在增加处理开销。

如果不使用input参数,请使用

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

如果不使用函数内定义的variables

 void foo(int key) { int hash = 0; int bkt __attribute__((unused)) = 0; api_call(x, hash, bkt); } 

现在稍后使用哈希variables为您的逻辑,但不需要bkt。 将bkt定义为未使用,否则编译器会说'bkt set bt not used“。

注:这只是为了压制警告而不是优化。

用gcc / g ++特定的方法来压缩源代码块的未使用的参数警告是用下面的pragma语句把它括起来:

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

我遇到了同样的问题。 我使用了第三方库。 当我编译这个库时,编译器(gcc / clang)会抱怨未使用的variables。

喜欢这个

test.cpp:29:11:warning:variables'magic'设置但不使用[-Wunused-but-set-variable] short magic [] = {

test.cpp:84:17:warning:unused variable'before_write'[-Wunused-variable] int64_t before_write = Thread :: currentTimeMillis();

所以解决scheme很清楚。 添加-Wno-unused作为gcc /叮当CFLAG将压制所有“未使用”的警告,甚至认为你有 – -Wall设置。

这样,你不需要改变任何代码。

我已经看到这种风格使用:

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

为了logging,我喜欢上面的Job的回答,但是我很好奇在“无所事事”声明中只使用variables名的解决scheme:

 void foo(int x) { x; /* unused */ ... } 

当然,这有弊端。 例如,没有“未使用”的注释,它看起来像一个错误,而不是一个有意识的代码行。

好处是没有DEFINE是需要的,它摆脱了警告。

是否有任何性能,优化或其他差异?

在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 () 

现在我不能说明究竟是什么意思了,因为三年来我都没有注意MSVC,但是他们压制了不影响结果的超级警告。