Как "скрыть " ложные" объявленные, но никогда не используемые " предупреждения?


Я использую компилятор 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 7

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: закрытие предупреждений компилятора