g ++ - 5.1.1仅在使用优化标志时警告未使用的变量

时间:2015-10-03 00:45:15

标签: c++ c++11 g++4.8 g++5.1

在一个大项目中,我从g ++ - 5.1.1获得了一些编译器警告 仅在构建发布版本(使用优化标志)时,但不是 在构建调试版本时(禁用大多数编译器优化)。 我已经将问题缩小到下面列出的最小例子中 重现问题。如果我使用g ++ - 4.8.4,则不会出现此问题。是 这是g ++ - 5.1.1中的一个错误吗?或者,这段代码是否做了合法错误的事情并保证警告?为什么不对代码中列出的最后三种情况产生任何警告(请参阅底部的编辑以获得一些解释)?

对于那些感兴趣的人,这是GCC的Bugzilla中的bug report

/*

This code complains that the variable 'container' is unused only if optimization
flag is used with g++-5.1.1 while g++-4.8.4 does not produce any warnings in
either case.  Here are the commands to try it out:

$ g++ --version
g++ (GCC) 5.1.1 20150618 (Red Hat 5.1.1-4)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -c -std=c++11 -Wall  -g -O0 test_warnings.cpp

$ g++ -c -std=c++11 -Wall  -O3 test_warnings.cpp
test_warnings.cpp:34:27: warning: ‘container’ defined but not used [-Wunused-variable]
 const std::array<Item, 5> container {} ;
                            ^
*/
#include <array>
struct Item 
{
    int itemValue_ {0} ;
    Item() {} ;
} ;

//
// The warning will go away if you do any one of the following:
// 
// - Comment out the constructor for Item.
// - Remove 'const' from the next line (i.e. make container non-const).
// - Remove '{}' from the next line (i.e. remove initializer list).
//
const std::array<Item, 5> container {} ;
//
// These lines do not produce any warnings:
//
const std::array<Item, 5> container_1 ;
std::array<Item, 5> container_2 ;
std::array<Item, 5> container_3 {} ;

编辑:正如Ryan Haining在评论中所提到的,container_2container_3将有extern链接,编译器无法警告其使用情况。

1 个答案:

答案 0 :(得分:1)

这看起来像一个错误,如果我们查看-Wunused-variable的文档(强调我的):

  

此选项意味着-Wunused-const-variable代表C,但不适用于C ++

如果我们查看-Wunused-const-variable,则会说:

  

每当一个常量静态变量未被使用时发出警告   宣言。此警告由C的-Wunused-variable启用,但是   不是为了C ++。 在C ++中,这通常不是const,因为const   变量取代了C ++中的#defines。

我们可以在the head revision of gcc中看到此警告消失。

此gcc错误报告:-Wunused-variable ignores unused const initialised variables也是相关的。虽然它反对C,但也讨论了C ++案例。

相关问题