Как «скрыть» ложные «объявленные, но никогда не использованные» предупреждения? - PullRequest
7 голосов
/ 26 апреля 2010

Я использую компилятор C ++ Builder 2007 Borland (AKA "Embarcodegearland"), в котором есть небольшая ошибка, заключающаяся в том, что определенные static const элементы из системных заголовочных файлов могут вызывать ложные "xyzzy is declared but never used" предупреждения.

Я пытаюсь освободить мой код от 100% предупреждений, поэтому я хочу скрыть эти конкретные предупреждения (заметьте, но не просто отключив предупреждение!)

Кроме того, я не могу изменить файлы заголовков. Мне нужен способ «подделать» использование предметов, желательно даже не зная их типа.

В качестве примера, добавление этой функции в мои модули .cpp исправляет предупреждения для этих четырех элементов, но выглядит немного «ad-hoc». Есть ли лучший и желательно самодокументированный способ сделать это?

static int fakeUse()
{
  return OneHour + OneMinute + OneSecond + OneMillisecond;
}

РЕДАКТИРОВАТЬ: Алекс предложил что-то вроде этого:

#pragma option push
#pragma warn -8080
#include "dateutils.hpp"
#pragma option pop

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

РЕДАКТИРОВАТЬ # 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.hpp в моем собственном коде.

Ответы [ 3 ]

9 голосов
/ 26 апреля 2010

Обычный способ ссылки на переменные выглядит примерно так:

#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, чтобы попробовать его, но это работает для других компиляторов.

6 голосов
/ 26 апреля 2010

Поддерживает ли C ++ Builder параметр #pragma warning? Если это так, вы можете отключить это предупреждение вокруг #include строк.

В псевдокоде

#pragma warning(push)
#pragma warning(disable: 1234)
#include <someheader.h>
#pragma warning(pop)

Нечто подобное ...

Это может помочь для C ++ Builder.

2 голосов
/ 26 апреля 2010

Другой вариант - использовать что-то вроде:

template <class T>
inline void unused(const T&) {}

Boost и Qt имеют значения ignore_unused_variable_warning и Q_UNUSED соответственно.

И вот небольшая статья об этом @ Sutter's Mill: Завершение предупреждений компилятора

...