Предупреждения пользователя на 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)
Однако, только небольшая косметика.