在C++11中,如何以在gcc、clang和MSVC中工作的方式生成警告消息?

hgqdbh6s  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(146)

当使用clang或gcc编译C++11时,我可以在编译时使用以下命令生成警告消息:

#warning My message here

字符串
但是,当我使用MSVC时,这在Windows上不起作用。我如何故意生成一个警告消息,而不管C++编译器如何?
这个问题不是"preprocessor #warning equivalent in Visual C++?"的重复,因为那个问题并不试图回答如何以跨编译器工作的方式实现它的问题。

bejyjqdl

bejyjqdl1#

以这个答案为起点,我找到了一个在gcc、clang和MSVC中工作的方法。下面的预编译器魔术将做到这一点:

#define EMIT_COMPILER_WARNING_STRINGIFY0(x) #x
#define EMIT_COMPILER_WARNING_STRINGIFY1(x) EMIT_COMPILER_WARNING_STRINGIFY0(x)
#ifdef __GNUC__
    #define EMIT_COMPILER_WARNING_COMPOSE(x) GCC warning x
#else
    #define EMIT_COMPILER_MESSAGE_PREFACE(type) \
    __FILE__ "(" EMIT_COMPILER_WARNING_STRINGIFY1(__LINE__) "): " type ": "
    #define EMIT_COMPILER_WARNING_COMPOSE(x) message(EMIT_COMPILER_MESSAGE_PREFACE("warning C0000") x)
#endif
#define WARNING(x) _Pragma(EMIT_COMPILER_WARNING_STRINGIFY1(EMIT_COMPILER_WARNING_COMPOSE(x)))

字符串
您可以使用以下命令触发警告:

WARNING("This is a warning message.")


在MSVC的情况下,它显示编译器消息的格式与编译器显示警告消息的格式相同,这会导致它被检测为警告。(使用C0000只是为了坚持该格式。C0000实际上不是MSVC中有效的警告消息编号。)
在GCC / clang的情况下,它只是使用支持的杂注来显示警告消息,使用_Pragma()而不是#pragma#warning

qnzebej0

qnzebej02#

#warning不是标准的C99特性(因为有些编译器只支持C99,有些程序可能不能用C++11及以后的标准库编译),所以不能在不支持它的编译器上使用。你可以使用#ifdef检查定义的编译器,并根据编译器修改指令。最简单(但不是最好)的解决方案:

#ifdef _MSC_VER  // if MSVC is the compiler
#    pragma NOTE(warning: warning here)
#else            // implied GCC or CLang
#    warning(warning here)
#endif

字符串
MSVC使用#pragma而不是#warning

相关问题