Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
在C++中,我能够在参数周围放置一个/*...*/
的注释。但是在C语言中不行,它会给我以下错误:
error: parameter name omitted
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);
...
}
#define UNUSED(...) (void)(__VA_ARGS__)
,它允许我将其应用于多个变量。 - Matthew MitchellUNUSED(argsv)
能够说明它的作用,而(void)argsv
则不能。 - mtvec在GCC中,你可以使用unused
属性来标记参数。
该属性应用于变量上,表示该变量可能未被使用。GCC不会对此变量产生警告。
实际上,这是通过在参数前添加__attribute__((unused))
来实现的。例如:
void foo(workerid_t workerId) { }
变成
void foo(__attribute__((unused)) workerid_t workerId) { }
__attribute__ ((unused))
。 - josch__attribute__((unused))
是专有的GCC扩展。虽然一些其他编译器也支持它,但我认为这在MSVC上不起作用。它并不直接属于编译器标准,因此与其他选项相比,它的可移植性较差。 - Zoe stands with Ukraine__attribute__ ((unused)) int myUnusedFunc()
不会产生未使用函数的警告。 - Alex Li你可以使用GCC或Clang的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;
。
__attribute__
),只需使用#define __attribute__(x)
? - Franklin Yuwarning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)警告。 - ideasman42看到这被标记为gcc,你可以使用命令行开关Wno-unused-parameter
。
例如:
gcc -Wno-unused-parameter test.c
当然,这会影响整个文件(根据您设置开关的位置,可能还包括整个项目),但您不需要更改任何代码。在gcc/g++中抑制一个源代码块中未使用参数的警告的特定方法是将其用以下#pragma语句括起来:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
[[maybe_unused]]
属性来抑制有关未使用参数的警告。Bool NullFunc([[maybe_unused]] const struct timespec *when, [[maybe_unused]] const char *who)
{
return TRUE;
}
void foo(int __attribute__((unused))key)
{
}
如果不使用函数内定义的变量
void foo(int key)
{
int hash = 0;
int bkt __attribute__((unused)) = 0;
api_call(x, hash, bkt);
}
void(x)
不会增加任何处理开销,编译器会将其优化掉。 - Majora320查看各个答案,了解__attribute__((unused))、各种#pragma等。可选地,为了可移植性,可以在其周围包装一个预处理器宏。
IDE可以通过视觉信号(不同颜色或下划线)来指示未使用的变量。在这种情况下,编译器警告可能是无用的。
在GCC和Clang中,在命令行末尾添加-Wno-unused-parameter选项(在打开未使用参数警告的所有选项之后,如-Wall、-Wextra)。
void foo(int bar) {
(void)bar;
}
在C23标准之前不允许,但是使用最新的编译器(在2023年)和在C ++中(自从很久以前)可以这样做。
void foo(int /*bar*/) {
...
}
请查看N2480 允许函数定义中的未命名参数 (pdf)提案,并检查https://en.cppreference.com/w/c/compiler_support的实现状态。
GCC 11、Clang 11和ICX 2022.2(oneAPI 2022.3)支持此功能。
C++17引入了[[maybe_unused]]
属性,已成为标准的一部分。在此之前,有[[gnu::unused]]
。请参见clang文档的概述。(gnu::
属性通常也可以在clang中使用。)
[[maybe_unused]]
,它与C++版本的工作方式相同。在C23之前的版本中,[[gnu::unused]]
编译器特定属性不可用,因为早期的C语言版本根本没有这些属性。
-Wno-unused-parameter
,它只是太嘈杂了,而且很少捕捉到错误,特别是在使用-Wshadow
时。 - Trass3r