例如:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
在C ++中,我能够对/*...*/
参数进行注释。但是,当然不是在C中,它给了我错误error: parameter name omitted
。
-Wno-unused-parameter
,太吵了,很少会发现错误,尤其是。什么时候-Wshadow
使用。
例如:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
在C ++中,我能够对/*...*/
参数进行注释。但是,当然不是在C中,它给了我错误error: parameter name omitted
。
-Wno-unused-parameter
,太吵了,很少会发现错误,尤其是。什么时候-Wshadow
使用。
Answers:
我通常会这样写一个宏:
#define UNUSED(x) (void)(x)
您可以将此宏用于所有未使用的参数。(请注意,这适用于任何编译器。)
例如:
void f(int x) {
UNUSED(x);
...
}
void f(int x) {UNUSED(x);}
。
#define UNUSED(...) (void)(__VA_ARGS__)
它可以将其应用于多个变量。
在gcc中,您可以使用unused
属性标记参数。
附加到变量的此属性意味着该变量可能未被使用。GCC不会对此变量发出警告。
实际上,这是通过将__attribute__ ((unused))
参数放在前面来实现的。例如:
void foo(workerid_t workerId) { }
变成
void foo(__attribute__((unused)) workerid_t workerId) { }
__attribute__ ((unused))
摆在争论前面。
您可以使用gcc / clang的未使用属性,但是我在标头中使用这些宏,以避免在整个源代码中__attribute__
都有gcc特定的属性,而且到处都有点冗长/难看。
#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;
#define __attribute__(x)
针对非GCC环境(__attribute__
MSVC不支持AFAIK )?
warning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)
一种gcc / g ++抑制源代码块未使用的参数警告的特定方法是用以下pragma语句将其括起来:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
标记属性是理想的方法。MACRO有时会导致混乱。通过使用void(x),我们在处理中增加了开销。
如果不使用输入参数,请使用
void foo(int __attribute__((unused))key)
{
}
如果不使用函数内部定义的变量
void foo(int key)
{
int hash = 0;
int bkt __attribute__((unused)) = 0;
api_call(x, hash, bkt);
}
现在,稍后将hash变量用于您的逻辑,但不需要bkt。将bkt定义为未使用,否则编译器会显示“未使用bkt设置bt”。
注意:这只是为了抑制警告而不是优化。
void(x)
,编译器会对其进行优化。
我遇到了同样的问题。我使用了第三方库。当我编译该库时,编译器(gcc / clang)将抱怨未使用的变量。
像这样
test.cpp:29:11:警告:已设置变量“魔术”,但未使用[-Wunused-but-set-variable]短魔术[] = {
test.cpp:84:17:警告:未使用的变量'before_write'[-Wunused-variable] int64_t before_write = Thread :: currentTimeMillis();
因此,解决方案非常明确。新增中-Wno-unused
为gcc / clang CFLAG会抑制所有“未使用”的警告,即使您已-Wall
设置也是如此。
这样,您无需更改任何代码。
在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,但是它们抑制了不会影响结果的超级警告。
我已经看到这种风格的使用:
if (when || who || format || data || len);
struct { int a; } b = {1}; if (b);
GCC警告used struct type value where scalar is required
。
作为记录,我喜欢上面乔布斯的回答,但我对仅在“不做任何事情”语句中单独使用变量名的解决方案感到好奇:
void foo(int x) {
x; /* unused */
...
}
当然,这有缺点。例如,如果没有“未使用”的注释,它看起来就像是一个错误,而不是故意的代码行。
好处是不需要DEFINE,并且摆脱了警告。
有性能,优化或其他差异吗?