例如:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
在C ++中,我能够对参数进行/*...*/
注释。但当然不是在C中,它给了我错误error: parameter name omitted
。
答案 0 :(得分:263)
我通常会写一个像这样的宏:
#define UNUSED(x) (void)(x)
您可以将此宏用于所有未使用的参数。 (请注意,这适用于任何编译器。)
例如:
void f(int x) {
UNUSED(x);
...
}
答案 1 :(得分:89)
在gcc中,您可以使用unused
attribute标记参数。
此属性附加到变量,表示变量为 意味着可能未使用。海湾合作委员会不会对此发出警告 变量
实际上,这是通过在参数之前放置__attribute__ ((unused))
来实现的。例如:
void foo(workerid_t workerId) { }
变为
void foo(__attribute__((unused)) workerid_t workerId) { }
答案 2 :(得分:54)
你可以使用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;
答案 3 :(得分:16)
使用带有未使用属性的gcc:
int foo (__attribute__((unused)) int bar) {
return 0;
}
答案 4 :(得分:8)
看到它被标记为gcc,您可以使用命令行开关Wno-unused-parameter
。
例如:
gcc -Wno-unused-parameter test.c
当然,这会影响整个文件(甚至可能取决于设置开关的位置而定),但是您不必更改任何代码。
答案 5 :(得分:5)
标记属性是理想的方式。 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);
}
现在稍后使用哈希变量作为逻辑,但不需要bkt。将bkt定义为未使用,否则编译器说'bkt set bt not used“。
注意:这只是为了抑制警告而不是优化。
答案 6 :(得分:5)
禁止源代码块的未使用参数警告的gcc / g ++特定方法是使用以下pragma语句将其括起来:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
答案 7 :(得分:3)
我遇到了同样的问题。我使用了第三方库。当我编译这个库时,编译器(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将禁止所有“未使用”警告,即使您已设置-Wall
也是如此。
通过这种方式,您无需更改任何代码。
答案 8 :(得分:1)
在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,但它们会抑制不影响结果的超级警告。
答案 9 :(得分:0)
我见过这种风格:
if (when || who || format || data || len);
答案 10 :(得分:-1)
为了记录,我喜欢Job的上述答案,但我很好奇只是在“无所事事”声明中使用变量名称的解决方案:
void foo(int x) {
x; /* unused */
...
}
当然,这有缺点;例如,没有“未使用”的注释,它看起来像是一个错误,而不是一个有意的代码行。
好处是不需要任何DEFINE,它可以消除警告。
是否有任何性能,优化或其他差异?