如何在我不想编辑的第三方代码中禁用gcc中未使用的变量警告?

时间:2013-02-24 16:24:26

标签: c++ gcc compiler-warnings compiler-flags

我想知道你传递给gcc编译器的什么开关来关闭未使用的变量警告?我在Windows上遇到了错误,我不想触摸增强代码:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

我尝试同时使用-Wunused-value-Wno-unused-value,但都没有压制上述消息。

什么是正确的命令,这是我的编译行:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

也许-Wall会覆盖我的目标?

9 个答案:

答案 0 :(得分:213)

-Wno-unused-variable开关通常可以解决问题。但是,如果您关心项目中的这些内容,那么这确实是一个非常有用的警告。当GCC开始警告你不在代码中的事情时,它会变得很烦人。

我建议你保持警告,但是使用-isystem而不是-I来包含第三方项目的目录。那个标志告诉GCC不要警告你那些你无法控制的东西。

例如,代替-IC:\\boost_1_52_0,说-isystem C:\\boost_1_52_0

希望它有所帮助。祝你好运!

答案 1 :(得分:69)

有时你只需要压制一些警告而你想要保留其他警告,只是为了安全起见。在您的代码中,您可以使用GCC的未使用的属性来抑制变量甚至形式参数的警告。假设你有这段代码:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

当你需要使用这个函数作为处理程序时,可能会出现这种情况 - (imho)在C ++ Boost库中很常见。然后你需要第二个形式参数 version ,因此函数的签名与处理程序所需的模板相同,否则编译将失败。但是你不能在函数本身中真正需要它......

如何标记要从警告中排除的变量或形式参数的解决方案是:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC还有许多其他参数,您可以在手册页中查看它们。这也适用于C程序,不仅适用于C ++,我认为它几乎可用于所有功能,而不仅仅是处理程序。继续尝试! ;)

P.S。:最近我用它来抑制Boosts&#39;模板中的序列化如下:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

编辑:显然,我没有按你的要求回答你的问题,drak0sha做得更好。这是因为我主要关注问题的标题,我的不好。希望这可能有助于其他人因为这个头衔而来到这里...... :)

答案 2 :(得分:62)

如果您正在使用gcc并想要禁用所选代码的警告,则可以使用#pragma编译器指令:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

对于您控制的代码,您也可以使用__attribute__((unused))来指示编译器不使用特定变量。

答案 3 :(得分:15)

请参阅警告选项下的man gcc。那里有一大堆unused

  

警告选项
  ... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

如果您使用no-为其中任何一个添加前缀,则会禁用此警告。

  

许多选项都有以-f或-W开头的长名称,例如-fmove-loop-invariants,-Wformat等等。其中大多数都有积极和消极的形式; -ffoo的否定形式是-fno-foo。本手册仅记录这两种形式中的一种,无论哪种形式都不是默认形式。

更详细的说明可以在Options to Request or Suppress Warnings

找到

答案 4 :(得分:9)

使用-Wno-unused-variable应该有效。

答案 5 :(得分:3)

编译器已经告诉你了,它不是value而是variable。您正在寻找-Wno-unused-variable。另外,请尝试g++ --help=warnings查看可用选项列表。

答案 6 :(得分:3)

  

如何禁用gcc中未使用的变量警告?
  我在Windows上加速出错,我不想触摸升级代码......

您访问Boost's Trac并提交针对Boost的错误报告。

您的申请不负责清除库警告和错误。图书馆负责清除自己的警告和错误。

答案 7 :(得分:0)

-Wall-Wextra在GCC中设置阶段,随后的-Wno-unused-variable可能不会生效。例如,如果您有:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

然后GCC看到指令-Wall -Wextra,似乎忽略了-Wno-unused-variable

这可以看起来像下面这样,并且您获得了不停止在未使用的变量上进行编译的预期效果:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

有一个很好的理由将其称为“警告”与“错误”。仅仅因为您的代码不完整(例如,您正在对算法进行存根检验)而使编译失败可能会失败。

答案 8 :(得分:-3)

export IGNORE_WARNINGS=1

它会显示警告,但会继续构建