如何在C语言中禁止“未使用参数”的警告?

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

在C++中,我能够在参数周围放置一个/*...*/的注释。但是在C语言中不行,它会给我以下错误:

error: parameter name omitted


可能是如何抑制“未使用的变量x”警告的最佳方法的重复问题。 - Ciro Santilli OurBigBook.com
4
这个问题获得了更多的赞同票,最好将另一个问题标记为重复。 - sashoalm
1
请参考此问题的C++版本 - Shafik Yaghmour
-Wno-unused-parameter,它只是太嘈杂了,而且很少捕捉到错误,特别是在使用-Wshadow时。 - Trass3r
13个回答

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了,但它们抑制了超级啰嗦的警告,这些警告不会影响结果。

0

我见过这种风格被使用:

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

15
嗯,我不能说我喜欢这个,因为它假定所有涉及的参数都可以转换为布尔值。 - Suma
1
虽然编译器几乎肯定会将其优化掉,但这并不是一个好的惯例,因为它并不是很清楚正在发生什么,并且可能会混淆静态源检查程序。在我看来最好使用这里的其他建议之一。 - ideasman42
1
我简直不敢相信我仍然在收到这个问题的回复。问题说明它是用于C语言的。是的,在另一种语言中,这是行不通的。 - Iustin
2
我不会使用它,但因为新奇因素而点赞。 - mgalgs
4
检查变量的真实性可能会引发警告,特别是对于结构体。例如,struct { int a; } b = {1}; if (b); 如果使用GCC编译,它会发出警告:used struct type value where scalar is required - ideasman42

0

就记录而言,我喜欢Job的答案,但我很好奇是否有一种仅在“无作为”语句中使用变量名称本身的解决方案:

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

当然,这种方法也有缺点;例如,没有“未使用”注释,它看起来更像是错误而不是有意的代码。

好处是不需要DEFINE并且可以消除警告。


4
我之前在MSVC中使用过这个,但是GCC会出现“语句效果无效”的警告。所以,Job的解决方案是可行的。 - Dmitrii Semikin
这种方法在XCode中仍会生成警告。 - MOK9
这里没有叫做“Job”的人。它指的是哪个答案?你能直接链接到它吗?请通过编辑(更改)您的答案来回复,而不是在评论中回复(不要加上“Edit:”、“Update:”或类似的词语-问题/答案应该看起来像是今天写的)。 - Peter Mortensen
1
(void) x; /* unused */ 在使用 GCC 9.3.0 时可以消除警告。 - Peter Ludemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接