C/C++调试用的宏定义
使用宏定义进行调试信息的输出
输出调试信息的方法
调试时打印信息有三种形式:
一是直接写打印函数
二是用ifdef把打印函数包起来,但是这样频繁写ifdef,增大了写代码的压力
三就是直接define一个打印函数,需要打印信息的地方就使用这个宏就行了。
在写代码时使用 #define DEBUG
来开启宏定义调试,不需要调试时取消define就可以将所有打印调试信息的地方换成注释。
本文关注第三种方法,宏打印函数。
宏打印函数的形式
宏打印函数也有不同形式:
一是只打印用户输入的信息
二是只打印编译器生成的信息,如行数,函数名等
三是两者都打印
一般来说图方便用一,图全面用三,二感觉不常用。
另外cout与printf都可以用来写宏打印函数,但是在vs2019中用cout写宏打印函数时不能输出字符串。
一个简单的宏调试函数
大家可以复制源码,体验一波
#include<iostream>
#define DEBUG#ifdef DEBUG
#define DEBUG_PRINT printf
#else
#define DEBUG_PRINT /\
/printf
#endifint main () {int a = 0;DEBUG_PRINT ( "%d",a );
}
多种宏定义的合集
另外可以输出各种附加信息,比如文件名,代码行号,函数名,日期,时间等等
这玩意真的可以玩出花来
#include<iostream>#define DEBUG#ifdef DEBUG
#define DEBUG_COUT std::cout<<"\nDEBUG_COUT "
#else
#define DEBUG_COUT /\
/ std::cout
#endif#ifdef DEBUG
#define DEBUG_COUT_INFO std::cout<<"\nDEBUG_COUT_INFO file:"<< __FILE__<<"\nDEBUG_COUT_INFO file:"<<__LINE__;
#else
#define DEBUG_COUT /\
/ std::cout<<"\n"<< __FILE__,__LINE__
#endif#ifdef DEBUG
#define DEBUG_COUT_INFO_EX std::cout<<"\nDEBUG_COUT_INFO_EX file:"<< __FILE__<<"\nDEBUG_COUT_INFO_EX line:"<<__LINE__<<"\nDEBUG_COUT_INFO_EX user:"
#else
#define DEBUG_COUT /\
/ std::cout<<"\n"<< __FILE__,__LINE__
#endif#ifdef DEBUG
#define DEBUG_PRINT printf("\nDEBUG_PRINT:");printf
#else
#define DEBUG_PRINT /\
/printf
#endif#ifdef DEBUG
#define DEBUG_PRINT_INFO printf( "\nDEBUG_PRINT_INFO file: %s;\nDEBUG_PRINT_INFO line: %d function: %s\n",__FILE__,__LINE__,__FUNCTION__)
#else
#define DEBUG_PRINT_INFO /\
/printf
#endif#ifdef DEBUG
#define DEBUG_PRINT_INFO_EX(format,...) printf("\nDEBUG_PRINT_INFO_EX file: %s\nDEBUG_PRINT_INFO_EX line: %d\nDEBUG_PRINT_INFO_EX function"format"\n",__FILE__, __LINE__,__FUNCTION__, ##__VA_ARGS__)
#else
#define DEBUG_PRINT_INFO_EX /\
/DEBUG_PRINT_INFO_EX(format,...) printf("FILE: %s, LINE: %d\n"format"\n",__FILE__, __LINE__, ##__VA_ARGS__)
#endifint main () {int a = 0;DEBUG_COUT << a;DEBUG_COUT_INFO;DEBUG_COUT_INFO_EX <<a;DEBUG_PRINT ( "%d",a );DEBUG_PRINT_INFO;DEBUG_PRINT_INFO_EX ( "%d",a );
}
C/C++调试用的宏定义相关推荐
- c语言中void和define,C语言里面的内联函数(inline)与宏定义(#define)探讨
C语言里面的内联函数(inline)与宏定义(#define)探讨 先简明扼要,说下关键: 1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样 ...
- 巧用宏定义进行调试 (转)
巧用宏定义进行调试 在进行程序设计时,有时我们往往不希望借住于调试工具(如:gdb, vc),而以输出调试信息的方式进行调试时,我们就可以借住于强大的宏定义来进行调试. 一.在GCC下的定义方法 ...
- VS(visual studio)如何查看预处理后的文件?(查看宏定义展开,头文件展开等)(注意如果要运行或调试代码,要把第一步的改回来!!!!)
如图,右键点击项目,选择属性: 找到预处理器–>预处理到文件,选择是,点击应用 找到项目中需要查看预处理后的文件,点击编译 打开被编译文件所在文件夹 进入debug文件夹 这个main.i就是我 ...
- c#利用宏定义调试代码
#define 使用 #define 来定义符号. 将符号用作传递给 #if 指令的表达式时,该表达式的计算结果为 true,如以下示例所示: #define DEBUG 说明 #define 指令不 ...
- 宏定义对调试代码的作用
以如下代码为例: //head.h #ifndef __HEAD_H__ #define __HEAD_H__#define NUM1 10 #define NUM2 20 #endif//sum.c ...
- C语言宏定义-跟踪调试宏
C语言宏定义-跟踪调试宏 文章目录 C语言宏定义-跟踪调试宏 1. 简介 2. 相关宏 3. 例子 1. 简介 标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预 ...
- [C语言] 在单片机的嵌入式开发中使用宏定义一键开关日志输出/打log调试
前言 在编写项目时,我们通常需要日志输出来帮助我们追踪程序执行的内容,以便在出现BUG时较为方便的复现,并在调试完成后快速的关闭过于详细的LOG输出,避免干扰使用中的体验,在函数中一个一个的增加pri ...
- gdb调试宏定义并显示宏定义的值
宏定义#define APLLCON0 *((volatile unsigned int *)0xFF500100),值为虚拟地址 问题: gdb跟踪调试想查看该宏的值时,如下提示:No symbol ...
- 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法
C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...
最新文章
- ECSHOP商品详情页”增加自定义TITLE
- 奇奇seo优化软件_seo优化软件如何选择
- Bluetooth Low Energy 嗅探
- Centos7 系统下搭建.NET Core2.0+Nginx+Supervisor+Mysql环境
- MySQL内核:InnoDB存储引擎 卷1
- nagios利用pyfetion报警最新
- linux进入命令是什么,linux进入目录的命令是什么
- Spark内存管理(3)—— 统一内存管理设计理念
- 什么是javax.ws.rs.core.context? [ 第1部分 ]
- git clone 报“The project you were looking for could not be found.”
- inno setup读取XML文件
- 前端常见安装的一些环境和配置
- ArduinoUNO测试VEML6075紫外线传感器
- PicGo 安装及配置
- 业务流程图是什么?怎么画?
- 介绍谱聚类(spectral clustering)
- php google gmail第三方登录
- 一篇我觉得不错的文章
- 阅读笔记(Every Document Owns Its Structure: Inductive Text Classification via Graph Neural Networks)
- 智慧工地系统包括哪些部分
热门文章
- Encode Decode
- 学习windows powershell(文件系统导航)
- Nacos通过OpenAPI主动发送心跳失效问题
- 今日好物推荐:音频转文字软件有哪些?
- 视频教程-2017年软上半年软考网络工程师级别考前冲刺之第四天-软考
- 解决俄罗斯Lopatkin精简版Win10无法远程的问题及同类精简版系统无法远程问题
- Linux常用Office办公软件
- 计算机机房施工排名,机房监控十大品牌最新排名
- 如何复现大佬论文的代码?
- 第二节 弹性盒子( justify-content属性、align-items属性、flex-direction属性、flex-wrap属性)