Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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'
like image 252
Yuval Avatar asked May 29 '14 10:05

Yuval


1 Answers

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...

like image 192
Yuval Avatar answered Oct 05 '22 05:10

Yuval