Переносимость директивы препроцессора #warning

Я знаю, что директива #warning не является стандартным C / C ++, но несколько компиляторов поддерживают ее, включая gcc / g ++. Но для тех, кто его не поддерживает, они молча игнорируют его или это приведет к сбою компиляции? Другими словами, могу ли я безопасно использовать его в своем проекте, не нарушая сборку для компиляторов, которые его не поддерживают?

    Вероятно, если компилятор не поддерживает #warning, он выдаст ошибку. В отличие от #pragma, нет рекомендации, чтобы препроцессор игнорировал директивы, которые он не понимает.

    Сказав это, я использовал компиляторы на разных (достаточно распространенных) платформах, и они все поддерживали #warning.

    Следует отметить, что MSVC использует синтаксис:

     #pragma message ("ваш текст предупреждения здесь")
    

    Обычный синтаксис #warning генерирует фатальную ошибку

     C1021: неверная команда препроцессора «предупреждение»
    

    поэтому он не переносится для этих компиляторов.

    Вероятно, вы получите хотя бы непризнанное предупреждение о директиве от компиляторов, которые не распознают #warning, даже если блок кода не включен в вашу компиляцию. Это может быть или не быть воспринято как ошибка – компилятор может законно рассматривать его как ошибку, но многие из них будут более слабыми.

    Знаете ли вы (можете ли вы назвать) компилятор, отличный от GCC / G ++, который обеспечивает #warning? [ Отредактировано: Sun Solaris 10 (Sparc) и компиляторы Studio 11 C / C ++ принимают #warning.]

    Однажды у меня была эта проблема с компилятором для процессора Atmel. И это вызвало ошибки препроцессора из-за неизвестного токена #warning.

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

    На самом деле большинство компиляторов, о которых я знаю, игнорируют неизвестные директивы #pragma и выводят предупреждающее сообщение, поэтому в худшем случае вы все равно получите предупреждение.

    При переключении с 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 .

    Давайте будем гением компьютера.