Как "скрыть " ложные" объявленные, но никогда не используемые " предупреждения?
Я использую компилятор Borland (он же "Embarcodegearland") C++Builder 2007, который имеет незначительную ошибку, что некоторые элементы static const
из системных заголовочных файлов могут вызывать ложные "xyzzy is declared but never used"
предупреждения.
Я пытаюсь получить свой код 100% предупреждение бесплатно, поэтому хочу способ маскировки этих конкретных предупреждений (примечание-но не просто отключить предупреждение!)
Кроме того, я не могу изменить заголовочные файлы. Мне нужен способ "подделать" использование предметов, предпочтительно даже не зная их тип.
В качестве примера добавим эту функцию в my .cpp modules исправляет предупреждения для этих четырех элементов, но это кажется немного "ad-hoc". Есть ли лучший и предпочтительно самодокументирующий способ сделать это?
static int fakeUse()
{
return OneHour + OneMinute + OneSecond + OneMillisecond;
}
EDIT: Алекс предложил что-то вроде этого:
#pragma option push
#pragma warn -8080
#include "dateutils.hpp"
#pragma option pop
...что, к сожалению, не работает, потому что состояние предупреждения не управляется компилятором умно, поэтому сообщения по-прежнему отображаются.
[5]}EDIT #2: AshleysBrain имеет хорошее предложение. Я реализовал его, построив в "dateutils_fix.заголовочный файл " hpp " выглядит следующим образом:#ifndef DATEUTILS_FIXH
#define DATEUTILS_FIXH
#include <dateutils.hpp>
static void FIX_DATEUTIL_WARNINGS()
{
UNREFERENCED(OneHour);
UNREFERENCED(OneMinute);
UNREFERENCED(OneSecond);
UNREFERENCED(OneMillisecond);
}
#endif
... и затем #включая этот заголовок вместо dateutils.ГЭС в моем собственном коде.
3 ответа:
Обычный способ ссылаться на переменные выглядит примерно так:
#define UNREFERENCED(x) ((void)x) // ... void MyFunc() { const int x = 5; // never used for whatever reason UNREFERENCED(x); // stops compiler warning }
"приведение к void" фактически означает "ничего не делать с этим выражением", поэтому оно должно быть эквивалентно no-op. оно также считается ссылкой на переменную, поэтому предупреждение отключается. Однако вам нужно поместить его в код функции, поэтому, возможно, конструктор класса или метод запуска подойдет для вас. У меня нет C++ Builder, чтобы попробовать его, но это работает для других компиляторов.
Поддерживает ли C++ Builder опцию
#pragma warning
? Если это так, вы можете отключить это предупреждение вокруг строк#include
.В псевдокоде
#pragma warning(push) #pragma warning(disable: 1234) #include <someheader.h> #pragma warning(pop)
Что-то вроде этого...
Это может помочь для C++ Builder.
Другой вариант-использовать что-то вроде:
template <class T> inline void unused(const T&) {}
Boost и Qt имеют их как
ignore_unused_variable_warning
иQ_UNUSED
соответственно.И вот небольшая статья об этом @ Sutter's Mill: закрытие предупреждений компилятора