如何抑制“未使用的参数”?C?

例如:

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

在c++中,我能够在参数周围加上/*...*/注释。当然不是在C中,它会给出错误

错误:参数名称省略

246437 次浏览

我通常写一个这样的宏:

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

您可以将此宏用于所有未使用的参数。(注意,这适用于任何编译器。)

例如:

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

在GCC中,可以用unused属性. xml标记参数。

此属性附加到变量,意味着该变量为 意味着可能未使用。GCC不会对此产生警告 变量。< / p >

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

void foo(workerid_t workerId) { }

就变成了

void foo(__attribute__((unused)) workerid_t workerId) { }

我看到有人使用这种风格:

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

你可以使用GCC或铿锵声unused属性。然而,我在头文件中使用这些宏来避免在源代码中到处都有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;.

郑重声明,我喜欢Job的答案,但我更好奇的是在“什么都不做”中只使用变量名本身的解决方案。声明:

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

当然,这也有缺点;例如,如果没有“unused”;注意,这看起来像是一个错误,而不是有意的代码行。

这样做的好处是不需要DEFINE,并且消除了警告。

在GCC中使用unused属性:

int foo (__attribute__((unused)) int bar) {
return 0;
}
标签属性是理想的方式。MACRO有时会导致混乱。 通过使用void(x),我们在处理过程中增加了开销

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

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设置bt未使用”。

注意:这只是为了抑制警告,而不是为了优化。

我也有同样的问题。我使用了第三方库。当我编译这个库时,编译器(gcc/clang)将报错未使用的变量。

像这样

test.cpp:29:11:警告:变量'magic'设置但未使用[- wunused but-set-variable] 短魔术[]= {

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

. int64_t before_write = Thread::currentTimeMillis()

所以解决方案很清楚。添加-Wno-unused作为gcc/clang CFLAG将抑制所有“未使用”警告,即使你已经设置了-Wall

通过这种方式,您不需要更改任何代码。

gcc/g++特有的抑制源代码块未使用参数警告的方法是用以下pragma语句将其括起来:

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

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

现在我说不出/wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127到底是什么意思,因为我已经三年没有关注MSVC了,但是他们压制了不影响结果的超学究警告。

鉴于它被标记为gcc,您可以使用命令行开关Wno-unused-parameter

例如:

gcc -Wno-unused-parameter test.c

当然,这会影响整个文件(可能项目取决于你在哪里设置开关),但你不需要改变任何代码。

自c++ 17起,[[maybe_unused]]属性可用于抑制关于未使用参数的警告。

基于OP的示例代码:

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