抑制 C 编译器(例如 GCC)如“未使用变量 x”警告的最佳/最有效方法是什么?
GCC 的证明说明
-Wunused-变量
每当局部变量或非常量静态变量除声明外未使用时发出警告
我不想给我的编译器任何特定的标志来删除所有这些警告,只是为了特殊情况。
(void) variable
可能适用于某些编译器。
对于 C++ 代码,另请参阅Mailbag:关闭编译器警告 Herb Sutter 建议使用:
template<class T> void ignore( const T& ) { }
...
ignore(variable);
void foo(int /*bar*/) {
...
}
查看
__attribute__((unused))
、各种 #pragma
等的个别答案。可选地,将预处理器宏包裹在它周围以实现可移植性。
IDE 可以直观地标记未使用的变量(不同的颜色或下划线)。有了它,编译器警告可能就没用了。
在 GCC 和 Clang 中,在命令行末尾添加
-Wno-unused-parameter
选项(在所有打开未使用参数警告的选项之后,如 -Wall
、-Wextra
)。
void foo(int bar) {
(void)bar;
}
我找到一篇文章,http://sourcefrog.net/weblog/software/languages/C/unused.html,它解释了UNUSED。有意思的是,作者还把没用到的变量名打乱了,这样以后就不会不小心用到啦
摘录:
#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))
如果这真的是你想要的,你可以使用 unused 属性(仅限 GCC),比如:
void foo(int __attribute__((__unused__)) bar) {
...
}
当然,不仅仅是函数参数,但这是最常见的用例,因为它可能是 API 的回调函数,您实际上并不需要所有输入。
此外,GLib 有一个 G_GNUC_UNUSED 宏,我相信它扩展到该属性。
您可以使用
#pragma
使警告静音
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused"
int unususedVariable = 1;
#pragma clang diagnostic pop
如果您使用的是 GCC,请使用
#pragma gcc ...
#pragma unused <variable>
转换为 void 是最好的方法,因为它表明您没有“意外地”将变量保留在代码中 - 即:此函数可能是一个实例,其中您有一个需要相同参数类型的函数指针表和返回类型,但在这个特定的表条目中,您没有使用参数。
也就是说,如果你不需要它,就把它扔掉。 ;)
这是一个非常 hackish 的解决方案,但请尝试简单地将变量分配给它自己。
我认为这应该让大多数编译器误以为使用了该变量。它也应该很便携。
分配给自己:
void f(int unused) {
unused = unused;
}
它在 GCC 中有效,但 Clang 需要 -Wno-self-assign.
我认为转换为 void 是最便携的解决方案:GCC 和 Clang 都理解这一点,即使有完整的警告
-W{all,extra,pedantic}
:
(void)unused;
从代码中删除未使用的变量声明(双关语)。
(什么???这就是我所做的:指出显而易见的最有可能是最好的解决方案。)
现在,从对其他答案的评论来看,显然是宏生成的垃圾。嗯,这是一个 pleonasm.
解决方案:
如果它被使用并且你正在发布项目,请将其删除。最糟糕的是,评论它。