c-抑制“未使用的变量x”警告的最佳方法是什么
这个问题已经在这里有了答案:
如何在C语言中禁止“未使用的参数”警告? 11个答案
抑制“未使用的变量x”警告之类的编译器(在本例中为gcc)的最佳/最正确的方法是什么?
我不想给gcc某些标志以删除所有这些警告,仅在特殊情况下。
gustaf asked 2020-01-15T09:02:06Z
11个解决方案
43 votes
(void) variable可能适用于某些编译器。
有关C ++代码,另请参阅[http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/],Herb Sutter建议使用:
template void ignore( const T& ) { }
...
ignore(variable);
jamesdlin answered 2020-01-15T09:02:55Z
24 votes
不要给变量起名字(C ++)
void foo(int /*bar*/) {
...
}
使用特定于编译器的非标准机制告诉编译器
请参见有关2703502242187057052032,各种2703502242187052020s等的答案。 (可选)将preprocesor宏包装在其周围,以实现可移植性。
关闭警告
IDE可以直观地用信号通知未使用的变量(不同的颜色或下划线)。 有了这一点,编译器警告可能会毫无用处。
在GCC和Clang中,在命令行末尾添加2703502242187052020选项(在所有打开未使用的参数警告的选项之后,例如-Wall,-Wextra)。
将演员表添加到虚空
void foo(int bar) {
(void)bar;
}
根据jamesdlin的回答和[http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/]
user7610 answered 2020-01-15T09:03:47Z
22 votes
找到了一篇说明UNUSED的文章[http://sourcefrog.net/weblog/software/languages/C/unused.html]。 有趣的是,作者还处理了未使用的变量名,以便您将来不会无意中使用它。
摘抄:
#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif
void dcc_mon_siginfo_handler(int UNUSED(whatsig))
Edward Leno answered 2020-01-15T09:02:31Z
13 votes
如果这确实是您想要的,则可以使用未使用的属性(仅gcc),例如:
void foo(int __attribute__((__unused__)) bar) {
...
}
当然,不仅用于函数参数,而且这是最常见的用例,因为它可能是API的回调函数,实际上您并不需要所有输入。
此外,GLib还有一个G_GNUC_UNUSED宏,我相信它会扩展到该属性。
Cascabel answered 2020-01-15T09:04:16Z
12 votes
您可以使用#pragma gcc ...消除警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused"
int unususedVariable = 1;
#pragma clang diagnostic pop
如果您使用的是GCC,请使用#pragma gcc ...
James Webster answered 2020-01-15T09:04:40Z
3 votes
#pragma unused
nmichaels answered 2020-01-15T09:05:00Z
2 votes
这是一个非常棘手的解决方案,但是您是否尝试过简单地将变量分配给自己? 我认为这应该使大多数编译器误以为使用了该变量。 也应该很便携。
Mhmmd answered 2020-01-15T09:05:20Z
1 votes
强制转换为空是最好的方法,因为它表明您没有“偶然地”将变量保留在代码中-即:该函数可能是一个实例,在该实例中您具有需要相同参数类型的函数指针表,并且 返回类型,但在此特定的表条目中,您没有使用参数。
就是说,如果您不需要它,请摆脱它。 ;)
Mike Stroven answered 2020-01-15T09:05:45Z
0 votes
将其分配给自己。
void f(int unused) {
unused = unused;
}
在gcc中工作,但是clang需要-Wno-self-assign。
编辑:我现在认为强制转换为空是最可移植的解决方案:即使有完整的警告-W{all,extra,pedantic},gcc和clang也都可以理解:
(void)unused;
user2394284 answered 2020-01-15T09:06:14Z
-9 votes
如果使用了它并且您正在运送项目,请删除它。 最糟糕的评论。
Praveen S answered 2020-01-15T09:06:34Z
-9 votes
从代码中删除未使用的变量声明。 (双关语意)
(做什么?这就是我要做的:指出显而易见的是最有可能的最佳解决方案。)
现在,从对其他答案的评论来看,显然这是从宏生成的垃圾。 好吧,这是一个多方面的问题。
解决方案:
仅在确实使用该变量时才将其重构为#if声明该变量;
创建另一个版本的宏,以跳过未使用的变量生成。
更好的是,避免使用将问题引入代码的宏。
jpinto3912 answered 2020-01-15T09:07:21Z