#warning预处理器指令的可移植性

我知道#warning指令不是标准的C / C ++,但是有几个编译器支持它,包括gcc / g ++。 但对于那些不支持它的人,他们会默默地忽略它,否则会导致编译失败? 换句话说,我可以安全地在我的项目中使用它,而不会破坏不支持它的编译器的构build?

如果编译器不支持#warning,很可能会发出错误。 与#pragma不同,不build议预处理程序忽略它不理解的指令。

话虽如此,我已经在各种不同的(合理的)平台上使用过编译器,并且都支持#warning。

应该指出,MSVC使用的语法是:

 #pragma信息(“你的警告文字在这里”)

通常的#warning语法会生成一个致命错误

 C1021:无效的预处理器命令“警告”

所以这些编译器是不可移植的。

即使编码中没有包含代码块,您也很可能会从不知道#warning的编译器中获得至less一个无法识别的指令警告。 这可能会也可能不会被认为是一个错误 – 编译器可以合法地把它当作一个错误,但是许多人会更为宽松。

你知道(你可以命名)GCC / G ++以外的编译器提供#warning吗? [ 编辑: Sun Solaris 10(Sparc)和Studio 11 C / C ++编译器都接受#warning。]

Atmel处理器的编译器曾经遇到过这个问题。 而且由于未知的#warning令牌,它确实会产生预处理器错误。

不幸的是,解决scheme似乎是将整个源代码树转换为使用#pragma等价物,并接受如果使用gcc,构build行为将会有所不同。

实际上我知道的大多数编译器忽略了未知的#pragma指令,并输出一个警告信息 – 所以在最坏的情况下,你仍然会得到一个警告。

从mingw切换到Visual Studio时,我将这些行添加到我的全局configuration标题。 (包含在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 ,所以它警告未指定的附注。

我怀疑,海湾合作委员会将添加#pragma warning"而不是微软添加#pragma warning"