我知道 C/C++ 中的 #warning 指令并不是标准,但是包括 gcc/g++ 等在内的一些编译器支持它。但对于那些不支持它的编译器,它们会默默忽略它还是会导致编译失败?换句话说,如果我的项目中使用了 #warning 指令,那么是否可以在不破坏不支持它的编译器的构建的情况下安全地使用它?
我知道 C/C++ 中的 #warning 指令并不是标准,但是包括 gcc/g++ 等在内的一些编译器支持它。但对于那些不支持它的编译器,它们会默默忽略它还是会导致编译失败?换句话说,如果我的项目中使用了 #warning 指令,那么是否可以在不破坏不支持它的编译器的构建的情况下安全地使用它?
需要注意的是,MSVC使用以下语法:
#pragma message ( "your warning text here" )
通常的#warning语法会生成致命错误:
C1021: invalid preprocessor command 'warning'
因此,该语法对于那些编译器来说不具有可移植性。
如果编译器不支持 #warning,那么它很可能会发出一个错误。与 #pragma 不同的是,预处理程序没有建议忽略它不理解的指令。
话虽如此,我在各种不同(相当普遍的)平台上使用过编译器,并且它们都支持 #warning。
当从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"
而不是微软添加#warning
。
我曾经遇到过一个Atmel处理器的编译器问题。由于未知的 #warning 标记,它会生成预处理器错误。
不幸的是,解决方案似乎是将整个源代码树转换为使用 #pragma 等效项,并接受如果使用 gcc,则构建行为会有所不同。
#pragma message
不会生成警告,它只是将文本输出到“构建日志”中。因此,例如,在“错误列表”窗口中不会显示它,也不会增加警告总数。 - nevermind