Why does -Wunused-variable in GCC produce an error even on static const?

c, c++, compiler-warnings, constants, gcc

Solution

It seems that this was not the error that halted compilation.

Rather, if GCC find another error, it would still report on this too.

I actually had another unused variable, and that's what caused this error in the first place.

For example, when creating the following files:

`file1.cc`

#include "head1.hh"

int main() {
    int bad_unused_variable;
    return my_ns::JUST_ANOTHER_CONST;
}

`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

You get:

> 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

EDIT This also seems to have been answered here: gcc warnings: defined but not used vs unused variable - there they mention the subtle differences between the two warning messages (`unused variable` vs `defined but not used`). Still, it doesn't really answer as to why GCC behaves this way...

Problem

I have a header, `core/types.hh`, used by several different build targets. It has the following declaration: `core/types.hh` ``` typedef std::size_t Size; static const Size SZ_MAX = std::numeric_limits<Size>::max(); ... ``` Some of the targets use this constant, some don't. So I get: ``` error: 'core::SZ_MAX' defined but not used" ``` I use scons with GCC 4.7.3 on Linux. I have `-Wall` set and want to keep it that way. As far as I understand from the GCC documentation, this shouldn't give a warning: `-Wunused-variable` Warn whenever a local variable or non-constant static variable is unused aside from its declaration. This warning is enabled by `-Wall.` So I don't see why I get a warning (which turns into an error). On other answers, people were advised to make the declaration `extern` and to do the assignment in the file that uses the constant. This file is used by many other files, so it would loose its constant-ness if I do that. Furthermore, this file has header guards, so I think this should mean that the constant is actually created only once. I'd appreciate any help! Yuval Possible duplicates: - How to use typed constants with “unused variable” warnings? - c++ static array declared in h file gives warning 'defined but not used'

Original source

Related problems