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


93

我想知道您传递给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超越了我的目标?


如错误消息或多或少说的那样,请尝试-Werror=no-unused-variable
Joachim Isaksson

Answers:


236

-Wno-unused-variable开关通常是卓有成效的。但是,如果您在项目中关心这些事情,那确实是一个非常有用的警告。但是,当GCC开始警告您代码中未包含的内容时,这变得很烦人。

我建议您保持警告状态,但-isystem不要使用-I第三方项目的include目录。该标志告诉GCC不要警告您无法控制的内容。

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

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


在哪里添加此设置?是否在“项目设置/ AVR GNU C编译器/其他”下进行了设置,但将被忽略(路径正确,仍然会收到警告)将其添加到目录设置中时(取消选中相对路径复选框)AtmelStudio将崩溃。
hfrmobile 2014年

3
我们还有-Wno-unused-parameter未使用的函数参数, -Wno-unused-function未使用的函数
Ngo Thanh Nhan 18-10-16

1
您需要:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer

81

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

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

在某些情况下,您需要将此函数用作处理程序-这种(imho)在C ++ Boost库中很常见。然后,你需要第二个形式参数的版本,所以函数的签名是一样的处理程序需要的模板,否则编译会失败。但是您也不真正需要函数本身...

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

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

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

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

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

编辑:显然,我没有按照您的要求回答您的问题,drak0sha更好。这是因为我主要关注问题的标题,不好。希望这可能对其他人有所帮助,因为该标题而来到这里... :)


7
对于形式参数,您可以省略名称,例如void func(unsigned number, const int)。然后,gcc也不会抱怨未使用的version
奥拉夫·迪斯切

@OlafDietsche我认为这取决于gcc您使用的版本。IIRC,我不得不在4年前使用它来禁止有关未使用的警告version。;)
Dee'Kej

66

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

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

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



通常,我会说使用#pragma指令不是很安全,除非您真的知道自己在做什么,或者正在使用例如OpenMP进行并行化...;)
Dee'Kej 2016年

1
#pragma如果将@ Dee'Kej 指令包装到中,它们是绝对安全的#ifdef some_compiler ... #endif。警告是特定于编译器的功能,标准未定义。不带#pragmas的代码就不能禁止任何警告。
Kotauskas

@ vladislav-toncharov您对警告特定于编译器是正确的。但是,我们这里一般不讨论编译器警告,而是专门讨论GCC。您还正确地说#pragma不会有害。但是,IMO许多人不知道如何正确使用#pragma,这就是为什么我认为它“危险”(因为缺少更好的语言)。
Dee'Kej

15

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

警告选项
...-无用-无用功能-无用标签-无用参数-无用值-无用变量-无用但设置了参数-无用但设置了变量

如果在其中任何一个前面加上no-,它将禁用此警告。

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

可以在“ 请求或禁止警告”选项中找到更详细的解释。


不知道我可以在“ no-”前面加上任何警告。
RNA

10

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


啊,未使用的变量,不是未使用的值!
WilliamKF

5
或者,-Wno-error=unused-variable如果您想消除错误并保留警告。
Oskar N.

1
您实际上可以看到实际的警告是什么[-Werror=unused-variable]
Mats Petersson

3

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


3

如何禁用来自gcc的未使用的变量警告?
我在Windows上的增强功能中遇到错误,并且我不想触摸增强功能代码...

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

您的应用程序不负责清除库警告和错误。该库负责清除自己的警告和错误。


0

-Wall-Wextra为海湾合作委员会奠定了基础,后续行动-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)

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.