使用 pragma message 查找多变的 DEBUG 宏

简介: 使用 pragma message 查找多变的 DEBUG 宏

前言

这是 N 年前遇到的一个问题了。最近跟 DEBUG 宏对着干上了,正好翻到这篇总结 —— 记录了使用 pragma message 排查 同一个工程不同 CPPDEBUG 宏的值不同的过程。现对之前的总结做了更新整理,分享给各位小伙伴儿。

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 的文档截图,方便各位小伙伴儿阅读。

pragma-message-msdn.png

现象

test1.cppDEBUG 宏是定义了的,在 test2.cppDEBUG 宏并没有被定义。你有可能会好奇我是怎么知道的?我分别在 test1.cpptest2.cpp 里加了如下代码:

#ifdef DEBUG
#pragma message ("--------> DEBUG defined in file : " __FILE__)
#else
#pragma message ("--------> DEBUG NOT defined in file : " __FILE__)
#endif

test1.cpptest2.cpp 中,智能提示如下图:

intellisense-tip-debug-macro.png

编译输出如下图:

build-output-compare.png

从智能提示和编译输出信息都可以明显的看出,在 test1.cppDEBUG 宏是定义了的,在 test2.cppDEBUG 宏并没有被定义。好奇怪的现象。

查看工程配置

难道 DEBUG 宏不是根据工程配置来的吗?为此,特地查看了工程预定义宏。

project-defined-macros.png

从上图可知,只定义了 _DEBUG,并没有定义 DEBUG。之前一直以为定义了 _DEBUG 就同时定义了 DEBUG

看来 DEBUG_DEBUG 不一样!虽然知道了在工程中没有定义 DEBUG 宏,但是为什么在两个 cpp 里的表现不一样呢?

继续调查

继续使用伟大的 #pragma message 来排查,最后发现 test.cpp 包含了 tinyxml 库中的头文件 tinyxml.h,在此头文件中有如下语句。

tinyxml-define-debug-macro.png

至此,真相大白!!!

实战

如果你也想动手实战,可以使用下面的示例工程。

百度云 链接: 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

相关文章
|
测试技术
QT --- VS2017+Qt5.12 编译报错【E2512 功能测试宏的参数必须是简单标识符 】的解决方法
QT --- VS2017+Qt5.12 编译报错【E2512 功能测试宏的参数必须是简单标识符 】的解决方法
582 0
|
7月前
|
C++
VS code debug c代码 配置
VS code debug c代码 配置
70 0
|
7月前
|
算法 Serverless C语言
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
153 1
|
7月前
|
C++
Qt定义属性类信息报错‘Qstring‘ was not declared in this scope; did you mean ‘xxx‘?并且还有有一堆报错,问题还出现在moc文件
Qt定义属性类信息报错‘Qstring‘ was not declared in this scope; did you mean ‘xxx‘?并且还有有一堆报错,问题还出现在moc文件
123 0
|
7月前
|
编译器 程序员 C++
[C++] #ifndef和#define与#pragma once在头文件中的作用和关系
[C++] #ifndef和#define与#pragma once在头文件中的作用和关系
103 0
|
Linux 程序员 C语言
Vs code写C语言代码配置(超详细超基础)
写在前面: 近期不是重新温习一下C语言吗,也给自己升级换代一下编辑器,最初我一直用Dev c++ 写的C语言,因为没想往深的学习C语言,也不会去写什么大的项目,所以这个编辑器也是可以用,但是目前认真学习,发现那个东西真的适合初学者,对于我这种懒人不适合,项目代码管理起来很麻烦,所以一气之下我直接鸟枪换炮,整个大家伙——vs,但是vs真的太大了,而且默认装在C盘,我这破电脑小内存扛不住,所以就研究了一下vs code,下面就本人安装经验给新学者讲解如何安装。
843 0
QT编译警告 warning LNK4042: 对象被多次指定;已忽略多余的指定
QT编译警告 warning LNK4042: 对象被多次指定;已忽略多余的指定
294 0
|
编译器 C语言
宏、条件编译(#ifdef)、#include(头文件包含)、#error和 #pragma的区别、#和##的含义和应用
宏、条件编译(#ifdef)、#include(头文件包含)、#error和 #pragma的区别、#和##的含义和应用
112 0
|
编译器 C++
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决
Dev-c++中将头文件和头文件函数分离,编译主函数跳出undefined reference to 的问题解决