例如:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
在c++中,我可以把/*…*/注释参数。当然不是在C中,它会给出错误
错误:参数名称省略
例如:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
在c++中,我可以把/*…*/注释参数。当然不是在C中,它会给出错误
错误:参数名称省略
当前回答
从c++ 17开始,[[maybe_unused]]属性可以用来抑制关于未使用参数的警告。
基于OP的示例代码:
Bool NullFunc([[maybe_unused]] const struct timespec *when, [[maybe_unused]] const char *who)
{
return TRUE;
}
其他回答
我也有同样的问题。我使用了第三方库。当我编译这个库时,编译器(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();
所以解决方案很清楚。添加-Wno-unused作为gcc/clang CFLAG将抑制所有“unused”警告,即使你有-Wall set。
通过这种方式,您不需要更改任何代码。
我通常写一个这样的宏:
#define UNUSED(x) (void)(x)
您可以将此宏用于所有未使用的参数。(注意,这适用于任何编译器。)
例如:
void f(int x) {
UNUSED(x);
...
}
我看到有人使用这种风格:
if (when || who || format || data || len);
从c++ 17开始,[[maybe_unused]]属性可以用来抑制关于未使用参数的警告。
基于OP的示例代码:
Bool NullFunc([[maybe_unused]] const struct timespec *when, [[maybe_unused]] const char *who)
{
return TRUE;
}
您可以使用GCC或Clang的未使用属性。然而,我在头文件中使用这些宏来避免在源代码中到处都有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):
未使用的宏对包含括号的参数不起作用, 如果你有一个参数,比如float (* coordinates)[3],你不能这样做, 浮动未使用((*坐标)[3])或浮动(*未使用(坐标))[3]。这是我迄今为止发现的未使用宏的唯一缺点,在这些情况下,我回到(void)坐标;。