Я использую Borland (иначе "Embarcodegearland") Разработчик C++ компилятор 2007 года, который имеет незначительную ошибку, настолько бесспорную static const
объекты от системных заголовочных файлов могут вызвать побочный "xyzzy is declared but never used"
предупреждения.
Я пытаюсь получить свое предупреждение 100% кода свободного, поэтому хотят способ замаскировать эти конкретные предупреждения (примечание - но не путем простого выключения предупреждения!)
Кроме того, я не могу изменить заголовочные файлы. Мне нужен способ 'фальсифицировать' использование объектов, предпочтительно даже не зная их тип.
Как пример, добавляя эту функцию к моим .cpp модулям фиксирует предупреждения для этих четырех объектов, но это кажется немного 'специальным'. Существует ли лучшее и предпочтительно самодокументирующий способ сделать это?
static int fakeUse()
{
return OneHour + OneMinute + OneSecond + OneMillisecond;
}
Править: Alex предложил что-то вроде этого:
#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
... и затем #including этот заголовок вместо dateutils.hpp в моем собственном коде.
Обычный способ ссылаться на переменные выглядит примерно так:
#define UNREFERENCED(x) ((void)x)
// ...
void MyFunc()
{
const int x = 5; // never used for whatever reason
UNREFERENCED(x); // stops compiler warning
}
'приведение к void' фактически означает 'ничего не делать с этим выражением', поэтому должно быть эквивалентно бездействию. Это также считается ссылкой на переменную, поэтому предупреждение не выводится. Однако вам нужно поместить его в код функции, поэтому, возможно, вам подойдет конструктор класса или метод запуска. У меня нет C ++ Builder, чтобы попробовать его, но это работает для других компиляторов.
Другой вариант - использовать что-то вроде:
template <class T>
inline void unused(const T&) {}
Boost и Qt имеют значения ignore_unused_variable_warning
и Q_UNUSED
соответственно.
А вот небольшая статья об этом на сайте Sutter's Mill: Выключение предупреждений компилятора
Поддерживает ли C ++ Builder параметр #pragma warning
? В таком случае вы можете отключить это предупреждение вокруг строк #include
.
В псевдокоде
#pragma warning(push)
#pragma warning(disable: 1234)
#include <someheader.h>
#pragma warning(pop)
Что-то вроде этого ...
Это может помочь для C ++ Builder.