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

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

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

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

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

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 в свой собственный код.


person Roddy    schedule 26.04.2010    source источник
comment
Если бы вы написали статическую функцию, которая никогда не вызывалась, разве вы не получили бы предупреждение об этом?   -  person ptomato    schedule 26.04.2010
comment
@птомато. Вроде нет :-) - мысленно размышляю, баг это или фича.   -  person Roddy    schedule 26.04.2010
comment
Есть ли шанс переключиться на VC++ или попросить людей из Borland исправить это? Поскольку это происходит из их заголовков/компилятора, а не из вашего кода IIUC.   -  person Alex Budovski    schedule 26.04.2010
comment
@Alex Алекс - я думаю, что это, вероятно, исправлено в последних версиях. И нет, VC++ не вариант.   -  person Roddy    schedule 26.04.2010


Ответы (3)


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

#define UNREFERENCED(x)  ((void)x)

// ...

void MyFunc()
{
    const int x = 5; // never used for whatever reason
    UNREFERENCED(x); // stops compiler warning
}

«Приведение к пустоте» фактически означает «ничего не делать с этим выражением», поэтому должно быть эквивалентно невыполнению операции. Однако это также считается ссылкой на переменную, поэтому предупреждение отключается. Однако вам нужно поместить его в код функции, поэтому, возможно, вам подойдет конструктор класса или метод запуска. У меня нет C++ Builder, чтобы попробовать, но это работает для других компиляторов.

person AshleysBrain    schedule 26.04.2010
comment
Но разве проблема не в том, что это происходит из-за системных заголовков, а не из его кода? - person Alex Budovski; 26.04.2010
comment
@Alex, правда, но я все еще могу исправить это таким образом. Компилятор может сделать вывод, что статика не используется только после того, как весь код скомпилирован. - person Roddy; 26.04.2010

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

В псевдокоде

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

Что-то такое...

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

person Alex Budovski    schedule 26.04.2010
comment
+1 за хорошую попытку :-) К сожалению, отключение предупреждения действует только в момент вывода сообщений (т. е. в конце компиляции) - поэтому, если вы «всплываете», сообщения все равно отображаются. Если вы не всплываете, то все предупреждения для «неиспользуемых» переменных скрыты. - person Roddy; 26.04.2010

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

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

Boost и Qt имеют их как ignore_unused_variable_warning и Q_UNUSED соответственно.

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

person Dmitry    schedule 26.04.2010
comment
Хорошая ссылка, спасибо. У меня такое чувство, что этот шаблонный подход может быть «более громоздким», если оптимизация отключена, в противном случае бот работает хорошо. - person Roddy; 26.04.2010