Я знаю, что директива #warning не является стандартной C/С++, но несколько компиляторов поддерживают ее, включая gcc/g++. Но для тех, кто его не поддерживает, они молча игнорируют его или это приведет к сбою компиляции? Другими словами, могу ли я безопасно использовать его в своем проекте, не нарушая сборку для компиляторов, которые его не поддерживают?
Переносимость директивы препроцессора #warning
Ответ 1
Вероятно, если компилятор не поддерживает #warning, он выдаст ошибку. В отличие от #pragma, нет рекомендации, чтобы препроцессор игнорировал директивы, которые он не понимает.
Сказав это, я использовал компиляторы на разных (достаточно распространенных) платформах, и они все поддерживали #warning.
Ответ 2
Следует отметить, что MSVC использует синтаксис:
#pragma message ( "your warning text here" )
Обычный синтаксиС#warning генерирует фатальную ошибку
C1021: invalid preprocessor command 'warning'
поэтому он не переносится для этих компиляторов.
Ответ 3
Вероятно, вы получите хотя бы нераспознанное предупреждение о директиве от компиляторов, которые не распознают #warning, даже если блок кода не включен в вашу компиляцию. Это может быть или не быть воспринято как ошибка - компилятор может законно рассматривать его как ошибку, но многие из них будут более слабыми.
Знаете ли вы (можете ли вы назвать) компилятор, отличный от GCC/g++, который обеспечивает #warning? [Отредактировано: Sun Solaris 10 (Sparc) и компиляторы Studio 11 C/С++ принимают #warning.]
Ответ 4
У меня была эта проблема один раз с компилятором для процессора Atmel. И это вызвало ошибки препроцессора из-за неизвестного токена #warning.
К сожалению, решение, казалось, состояло в том, чтобы преобразовать все дерево исходников в эквивалент #pragma и принять, что поведение сборки будет отличаться при использовании gcc.
Ответ 5
Собственно, большинство компиляторов, о которых я знаю, игнорируют неизвестные директивы #pragma и выводят предупреждающее сообщение, поэтому в худшем случае вы все равно получите предупреждение.
Ответ 6
При переключении с mingw на visual studio я добавил такие строки в свой глобальный заголовок конфигурации. (включить его в stdafx.h)
#ifdef __GNUC__
//from https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
//Instead of put such pragma in code:
//#pragma GCC diagnostic ignored "-Wformat"
//use:
//PRAGMA_GCC(diagnostic ignored "-Wformat")
#define DO_PRAGMA(x) _Pragma (#x)
#define PRAGMA_GCC(x) DO_PRAGMA(GCC #x)
#define PRAGMA_MESSAGE(x) DO_PRAGMA(message #x)
#define PRAGMA_WARNING(x) DO_PRAGMA(warning #x)
#endif //__GNUC__
#ifdef _MSC_VER
/*
#define PRAGMA_OPTIMIZE_OFF __pragma(optimize("", off))
// These two lines are equivalent
#pragma optimize("", off)
PRAGMA_OPTIMIZE_OFF
*/
#define PRAGMA_GCC(x)
// https://support2.microsoft.com/kb/155196?wa=wsignin1.0
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __PRAGMA_LOC__ __FILE__ "("__STR1__(__LINE__)") "
#define PRAGMA_WARNING(x) __pragma(message(__PRAGMA_LOC__ ": warning: " #x))
#define PRAGMA_MESSAGE(x) __pragma(message(__PRAGMA_LOC__ ": message : " #x))
#endif
//#pragma message "message quoted"
//#pragma message message unquoted
//#warning warning unquoted
//#warning "warning quoted"
PRAGMA_MESSAGE(PRAGMA_MESSAGE unquoted)
PRAGMA_MESSAGE("PRAGMA_MESSAGE quoted")
#warning "#pragma warning quoted"
PRAGMA_WARNING(PRAGMA_WARNING unquoted)
PRAGMA_WARNING("PRAGMA_WARNING quoted")
Теперь я использую PRAGMA_WARNING (это нужно исправить)
К сожалению, в gcc нет #pragma warning
, поэтому он предупреждает неуказанную прагму.
Я сомневаюсь, что gcc добавит #pragma warning"
вместо добавления Microsoft #warning
.