前言
这是 N
年前遇到的一个问题了。最近跟 DEBUG
宏对着干上了,正好翻到这篇总结 —— 记录了使用 pragma message
排查 同一个工程不同 CPP
中 DEBUG
宏的值不同的过程。现对之前的总结做了更新整理,分享给各位小伙伴儿。
pragma message
使用 #pragma message
可以在编译的过程输出我们指定的信息,是排查编译问题的好帮手。以下例子摘自微软官方文档,感兴趣小伙伴儿可以直接添加到自己的工程中使用。
// pragma_directives_message1.cpp
// compile with: /LD
#if _M_IX86 >= 500
#pragma message("_M_IX86 >= 500")
#endif
#pragma message( "Compiling " __FILE__ )
#pragma message( "Last modified on " __TIMESTAMP__ )
// with line number
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message (__FILE__ "[" STRING(__LINE__) "]: test")
下图是微软官方介绍 #pragma message
的文档截图,方便各位小伙伴儿阅读。
现象
在 test1.cpp
里 DEBUG
宏是定义了的,在 test2.cpp
里 DEBUG
宏并没有被定义。你有可能会好奇我是怎么知道的?我分别在 test1.cpp
和 test2.cpp
里加了如下代码:
#ifdef DEBUG
#pragma message ("--------> DEBUG defined in file : " __FILE__)
#else
#pragma message ("--------> DEBUG NOT defined in file : " __FILE__)
#endif
在 test1.cpp
和 test2.cpp
中,智能提示如下图:
编译输出如下图:
从智能提示和编译输出信息都可以明显的看出,在 test1.cpp
里 DEBUG
宏是定义了的,在 test2.cpp
里 DEBUG
宏并没有被定义。好奇怪的现象。
查看工程配置
难道 DEBUG
宏不是根据工程配置来的吗?为此,特地查看了工程预定义宏。
从上图可知,只定义了 _DEBUG
,并没有定义 DEBUG
。之前一直以为定义了 _DEBUG
就同时定义了 DEBUG
。
看来 DEBUG
和 _DEBUG
不一样!虽然知道了在工程中没有定义 DEBUG
宏,但是为什么在两个 cpp
里的表现不一样呢?
继续调查
继续使用伟大的 #pragma message
来排查,最后发现 test.cpp
包含了 tinyxml
库中的头文件 tinyxml.h
,在此头文件中有如下语句。
至此,真相大白!!!
实战
如果你也想动手实战,可以使用下面的示例工程。
百度云 链接: https://pan.baidu.com/s/1_7RKFf-jrSdjdBZihnPl1Q 提取码: eu8f
CSDN 链接:https://download.csdn.net/download/xiaoyanilw/12502953
总结
DEBUG
和 _DEBUG
是两个不同的宏。“官方” 支持的是 _DEBUG
而不是 DEBUG
。尽量使用 _DEBUG
而不是 DEBUG
。
参考资料
https://docs.microsoft.com/en-us/cpp/preprocessor/message?view=vs-2019