为什么GCC中的-Wunused-variable即使在静态const上也会产生错误?

Yuv*_*val 6 c c++ gcc const compiler-warnings

我有一个标题,core/types.hh由几个不同的构建目标使用.它有以下声明:

core/types.hh

typedef std::size_t  Size;

static const Size SZ_MAX = std::numeric_limits<Size>::max();
...
Run Code Online (Sandbox Code Playgroud)

一些目标使用这个常数,有些则没有.所以我得到:

error: 'core::SZ_MAX' defined but not used"
Run Code Online (Sandbox Code Playgroud)

我在Linux上使用带有GCC 4.7.3的scons.我已经-Wall设定并希望保持这种状态.

据我从GCC文档中了解,这不应该发出警告:

-Wunused-variable

除了声明之外,每当局部变量或非常量静态变量未使用时发出警告.此警告已启用-Wall.

所以我不明白为什么我会收到警告(这会变成错误).

在其他答案中,建议人们进行声明extern并在使用常量的文件中进行赋值.许多其他文件都使用此文件,因此如果我这样做,它将失去其常量.此外,这个文件有标题保护,所以我认为这应该意味着常量实际上只创建一次.

我很感激任何帮助!

尤瓦


可能重复:

Yuv*_*val 3

看来这不是停止编译的错误。

相反,如果 GCC 发现另一个错误,它仍然会报告此错误。

实际上我还有另一个未使用的变量,这就是导致此错误的原因。

例如,创建以下文件时:

file1.cc

#include "head1.hh"

int main() {
    int bad_unused_variable;
    return my_ns::JUST_ANOTHER_CONST;
}
Run Code Online (Sandbox Code Playgroud)

head1.hh

#ifndef HEAD1
#define HEAD1

#include <stdint.h>
#include <cstddef>
#include <limits>

namespace my_ns {
    typedef std::size_t Size;
    static const Size SZ_MAX = std::numeric_limits<Size>::max();
    static const Size JUST_ANOTHER_CONST = 8;
}

#endif
Run Code Online (Sandbox Code Playgroud)

你得到:

> g++ -Wall -Werror file1.cc -O2 -std=c++98 -o file1
file1.cc: In function 'int main()':
file1.cc:4:6: error: unused variable 'bad_unused_variable' [-Werror=unused-variable]
In file included from file1.cc:1:0:
head1.hh: At global scope:
head1.hh:10:20: error: 'my_ns::SZ_MAX' defined but not used [-Werror=unused-variable]
cc1plus: all warnings being treated as errors
Run Code Online (Sandbox Code Playgroud)

编辑 这似乎也在这里得到了回答:gcc warnings: Defined but notused vsunused variableunused variable - 他们在那里提到了两个警告消息( vs )之间的细微差别defined but not used。尽管如此,它并没有真正回答为什么GCC会这样做......