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):
UNUSED
macros不适用于包含括号的参数,
所以如果你有像float (*coords)[3]
这样的参数float (*coords)[3]
你不能这样做,
float UNUSED((*coords)[3])
或float (*UNUSED(coords))[3]
,这是我发现的UNUSED
macros的唯一缺点,在这种情况下(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,但是他们压制了不影响结果的超级警告。