如何在 minGW 中禁用 Eclipse 中的未使用变量警告?
Posted
技术标签:
【中文标题】如何在 minGW 中禁用 Eclipse 中的未使用变量警告?【英文标题】:How do I disable Unused Variable warnings in Eclipse in minGW? 【发布时间】:2013-05-14 15:36:54 【问题描述】:如何在 minGW 中禁用 C++ 中的以下警告?
warning: unused variable 'x' [-Wunused-variable]
在 Eclipse CDT 中,我找不到警告号:
../src/subfolder/ClassTwo.cpp:20:8: warning: unused variable 'x' [-Wunused-variable]
我试过这样做:
#pragma warning(push)
#pragma warning(disable: ?) //which number?
#include "subfolder/ClassTwo.h"
#pragma warning(pop)
但是没有用。
我的问题:
-
如何在 Eclipse CDT 中获取此警告号?
pragma 指令应该如何编写?
【问题讨论】:
如果是函数参数,不命名即可。不过,假设您使用 GCC,它更像是#pragma gcc diagnostic
之类的。
只需修复代码,警告就会自行消失... - 顺便说一句,是什么让您认为禁用标头中的警告将有助于解决似乎发生的警告在.cpp
伙计们,它可能是使用更宽松的约定构建的第 3 方标头。如果没有,那么是的 - 只需修复它。
@DavidRodríguez-dribeas,公平地说,如果我在使用带有需要特定参数的回调的 Windows API(即使未使用)时不留下未命名的东西,我会得到很多。
@chris:所以不要命名参数,或者通过 casting 将警告静音:void foo(int ignored) (void)ignored; ....
【参考方案1】:
由于修复“未使用的变量”警告几乎总是很容易,因此我更愿意修复实际代码而不是尝试使用编译指示修补它(这也可能隐藏其他未来的错误 - 例如,您添加新功能:
int foo(int x, int y)
return x * x;
糟糕,这是一个错字,它应该是return x * y;
- 一个警告会告诉你这是这种情况。
如有人提到的,未使用的参数通过删除参数名称来处理:
int foo(int x, int) // Second parameter, y is not used
return x * x;
如果它是一个局部变量,那么你可以使用(void)y
(也许在一个宏中)来“假用它”:
int bar(int x)
int y; // Not used.
(void)y;
或
#define NOT_USED(x) (void)(x)
int bar(int x)
int y; // Not used.
NOT_USED(y);
【讨论】:
谢谢,不过我只是想试试pragma的特性,不会自己写正确的代码 什么是微软的?UNREFERENCED_PARAMETER
?
是的,看起来就是这样。我也看到了“UNUSED(x)”这个宏。
我建议使用#define UNUSED(x) (void)sizeof(x)
,我不太记得确切的代码,但是我有一些非常奇怪的随机崩溃,因为我将一些 void 指针转换为 void,或者它可能是指向 void 指针的指针或类似的东西。
我已经多次使用#define UNUSED(x) (void)(x)
,包括涉及指针的时候。只要您传入实际变量,而不是,例如*x
,我会说如果它崩溃,那是编译器中的一个错误。【参考方案2】:
看起来像 clang 的输出。您可以使用 clang 使用此处概述的方法实现相同的目的:http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
#include "subfolder/ClassTwo.h"
#pragma clang diagnostic pop
如果那是您的源文件,那么只需 fix the warning。
对于 GCC,您可以使用:Selectively disable GCC warnings for only part of a translation unit?
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
#include "subfolder/ClassTwo.h"
#pragma GCC diagnostic pop
当然,这会给你留下大量的杂注——如果这是一件坏事,值得商榷 =)
【讨论】:
g++ -I"C:\c+\gtest-1.6.0\gtest-1.6.0\include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP - MF"src/Test.d" -MT"src/Test.d" -o "src/Test.o" "../src/Test.cpp" ../src/Test.cpp:1:0: 警告: 忽略 #pragma 警告 [-Wunknown-pragmas] ../src/Test.cpp:2:0: 警告:忽略 #pragma 警告 [-Wunknown-pragmas] ../src/Test.cpp:3:0: 警告: 忽略#pragma 警告[-Wunknown-pragmas] ../src/Test.cpp:5:0: 警告: 忽略#pragma 警告[-Wunknown-pragmas] @jiafu ok - 链接 GCC 方法并为您添加了修复警告的方法。【参考方案3】:您似乎在 GCC 编译器中使用 Microsoft C++ 风格的编译指示语法。 “警告编号”的概念(至少在该格式中)也是 Microsoft C++ 特有的。换句话说,这在 GCC 中是行不通的。
没有用于禁用/启用警告的标准语法,因此每个编译器都将使用自己的。这意味着没有办法“在 C++ 中”(引用你的标题)。在每个特定的编译器中只有几种方法可以做到这一点。为此,您必须查阅编译器文档。
在 GCC 中,您应该能够通过命令行选项来做到这一点 -Wno-unused-variable
禁用整个翻译单元的所有此类警告。此外,在 GCC 中,您实际上可以通过 __attribute__((unused))
有选择地将变量标记为未使用,以抑制针对该特定变量的警告。
http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes
【讨论】:
以上是关于如何在 minGW 中禁用 Eclipse 中的未使用变量警告?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Eclipse 中使用 MinGW 编译 boost 线程?
我在ComplexNumber.cpp中的一些方法得到一个奇怪的未定义的错误引用,虽然[复制]我对模板很新