Почему -Wunused-variable в GCC создает ошибку даже при статическом const?

У меня есть заголовок core/types.hh, используемый несколькими разными целями сборки. Он имеет следующее объявление:

core/types.hh

typedef std::size_t Size;
static const Size SZ_MAX = std::numeric_limits<size>::max();
...
</size>

Некоторые из целей используют эту константу, некоторые - нет. Поэтому я получаю:

error: 'core::SZ_MAX' defined but not used"

Я использую scons с GCC 4.7.3 в Linux. У меня есть -Wall set и хочу сохранить его таким образом.

Насколько я понимаю из документации GCC, это не должно вызывать предупреждения:

-Wunused-variable

Предупреждать, когда локальная переменная или статическая переменная непостоянная не используются, кроме объявления. Это предупреждение включено -Wall.

Поэтому я не понимаю, почему я получаю предупреждение (которое превращается в ошибку).

В других ответах людям было рекомендовано сделать объявление extern и выполнить назначение в файле, который использует константу. Этот файл используется многими другими файлами, поэтому он потеряет его постоянство, если я это сделаю. Кроме того, у этого файла есть защита заголовков, поэтому я думаю, что это должно означать, что константа фактически создается только один раз.

Буду признателен за любую помощь!

Юваль

Возможные дубликаты:

1 ответ

Кажется, что это была не ошибка, которая остановила компиляцию.

Скорее, если GCC найдет другую ошибку, она все равно сообщит об этом тоже.

У меня на самом деле была другая неиспользуемая переменная, и именно это и вызвало эту ошибку.

Например, при создании следующих файлов:

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
</size></limits></cstddef></stdint.h>

Вы получаете:

> 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

ИЗМЕНИТЬ На это также, как представляется, ответили: gcc-предупреждения: определены, но не используются vs unused variable - там они упоминают тонкие различия между двумя предупреждающими сообщениями (unused variable vs defined but not used). Тем не менее, на самом деле он не отвечает, почему GCC ведет себя таким образом...

licensed under cc by-sa 3.0 with attribution.