Предупреждения пользователя на msvc и gcc?

В MSVC у меня есть это в заголовке:

#define STR(x)          #x
#define STR2(x)         STR(x)
#define NOTE(text)      message (__FILE__ "(" STR2(__LINE__) ") : -NOTE- " #text)
#define noteMacro(text) message (__FILE__ "(" STR2(__LINE__) ") : " STR2(text))

и я делаю

#pragma NOTE(my warning here)

GCC имеет:

#warning(my warning here)

Однако MSVC (2003) бросает подгонку, когда видит #warning и дает "фатальную ошибку C1021: недопустимая команда препроцессора" warning ""

Что я могу сделать по этому поводу? Есть ли способ, чтобы GCC распознавал предупреждения MSVC или MSVC, не выдавал ошибку на предупреждения GCC? Есть ли что-то, что я могу сделать, что работает на обоих? Я могу заставить GCC предупредить меня о неизвестных прагмах, но это не самое идеальное решение.

Ответы

Ответ 1

Лучшее решение, которое я нашел для этой проблемы, состоит в следующем: в общем заголовке:

// compiler_warning.h
#define STRINGISE_IMPL(x) #x
#define STRINGISE(x) STRINGISE_IMPL(x)

// Use: #pragma message WARN("My message")
#if _MSC_VER
#   define FILE_LINE_LINK __FILE__ "(" STRINGISE(__LINE__) ") : "
#   define WARN(exp) (FILE_LINE_LINK "WARNING: " exp)
#else//__GNUC__ - may need other defines for different compilers
#   define WARN(exp) ("WARNING: " exp)
#endif

Затем используйте

#pragma message WARN("your warning message here")

во всем коде вместо #warning

В MSVC вы получите следующее сообщение:

c:\programming\some_file.cpp(3) : WARNING: your warning message here

Под gcc вы получите:

c:\programming\some_file.cpp:25: note: #pragma message: WARNING: your warning message here

Не идеальный, но разумный компромисс.

Ответ 2

Как вы теперь обнаружили, #warning не является стандартной функцией, поэтому вы не можете использовать его с компиляторами, которые не поддерживают его. Если вы хотите, чтобы ваш код работал на разных платформах, вы не будете использовать #warning вообще - или, по крайней мере, не в коде, который MSVC предназначен для обработки (его можно было предварительно обработать с помощью #ifdef или эквивалентного). Следовательно:

#ifdef __GNUC__
#warning(warning message)
#else
#pragma NOTE(warning message)
#endif

Но это повторяет сообщение, и я уверен, что вы не хотели этого делать - и он громоздкий; вы использовали бы его очень редко. Возможно, вам также придется иметь дело с другими компиляторами, чем с GCC (и я недостаточно знаком с MSVC, чтобы узнать, как его достоверно идентифицировать).

Было бы хорошо, если бы #warning были стандартизированы; он не стандартизирован в C99.

(Однажды давным-давно был задан вопрос о таких функциях, которые можно было добавить в C и #warning.)

См. также: Переносимость директивы препроцессора # предупреждения

Ответ 3

Охранять их с помощью операторов #if. Найдите символ, определенный одним компилятором, но не другим.

#ifdef _MSC_VER
#pragma NOTE(my warning here)
#else
#warning(my warning here)
#endif

Вид уродливый, но я не вижу другого способа.

Ответ 4

Если вы хотите, вы можете добавить к вышеуказанным решениям небольшую вещь (#pragma warning) до ваш #pragma message:

#pragma warning()
#pragma message(" SOME USER WARNING - FILE LINE etc... ")

Эта небольшая надстройка генерирует реальное предупреждение и не выглядит плохой в окне VC. Например:

1>e:\proj\file.h(19) : warning C4615: #pragma warning : unknown user warning type
1> SOME USER WARNING - FILE LINE etc...
1>proj - 0 error(s), 1 warning(s)

Обычно я использую этот метод для предупреждений не слишком тихий, как в коде кода без #pragma warning().

Например, форма предупреждений слишком тихая (для меня, конечно).

1> SOME USER WARNING - FILE LINE etc..
1>proj - 0 error(s), 0 warning(s)

Однако, только небольшая косметика.