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

Wil*_*mKF 83 c++ gcc compiler-flags compiler-warnings

我想知道你传递给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]
Run Code Online (Sandbox Code Playgroud)

我尝试使用两者-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
Run Code Online (Sandbox Code Playgroud)

也许这-Wall超越了我的目标?

小智 218

-Wno-unused-variable开关通常是卓有成效的.但是,如果您关心项目中的这些内容,那么这确实是一个非常有用的警告.当GCC开始警告你关于你的代码中没有的东西时,它会变得很烦人.

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

例如,而不是-IC:\\boost_1_52_0-isystem C:\\boost_1_52_0.

希望能帮助到你.祝好运!

  • 对于未使用的函数参数,我们也有`-Wno-unused-parameter`,对于未使用的函数,我们也有`-Wno-unused-function` (3认同)
  • 你需要:`-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable` (3认同)

Dee*_*Kej 75

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

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

PS:最近我使用它来抑制模块中Boosts序列化的警告,如下所示:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))
Run Code Online (Sandbox Code Playgroud)

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

  • 对于形式参数,可以省略名称,例如`void func(unsigned number,const int)`.然后,gcc也不会抱怨未使用的`版本`. (7认同)

Ole*_*olf 65

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

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一些GCC错误的模块:[Bug C++/53431:C++预处理器忽略#pragma GCC诊断](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431); [Bug C++/66943:GCC警告OpenMP的Unknown Pragma,即使它支持它](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943)和朋友. (3认同)

Ola*_*che 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.本手册仅记录这两种形式中的一种,无论哪种形式都不是默认形式.

可在" 请求或抑制警告选项"中找到更详细的说明


Mat*_*son 9

使用-Wno-unused-variable应该工作.

  • 或者`-Wno-error = unused-variable`如果你想删除错误并保持警告. (2认同)

小智 8

您可以在变量前加上“(void)”前缀。\n如果您无权访问构建框架或者只想影响行为的本地更改,这会很有用。

\n

IE:

\n
int main()\n{\n  int unused1;       //This will print warning\n  int unused2;       //This will not print warning -\n                     //                             |\n  (void) unused2;    // <----------------------------\n}\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
$ g++ -Wall test.cc\ntest.cc: In function \xe2\x80\x98int main()\xe2\x80\x99:\ntest.cc:4:7: warning: unused variable \xe2\x80\x98unused1\xe2\x80\x99 [-Wunused-variable]\n    4 |   int unused1;\n      |       ^~~~~~~\n
Run Code Online (Sandbox Code Playgroud)\n