如何在 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 中的未使用变量警告?的主要内容,如果未能解决你的问题,请参考以下文章

C ++ / Eclipse中的未定义符号错误[关闭]

如何在 Eclipse 中使用 MinGW 编译 boost 线程?

对“__mingw_vsscanf”的未定义引用

我在ComplexNumber.cpp中的一些方法得到一个奇怪的未定义的错误引用,虽然[复制]我对模板很新

如何强制 Eclipse CDT MinGW 工具链使用 mingw32-g++.exe?

C : Visual Studio 和 Eclipse+MinGW 中的预编译头文件