使用宏定义进行调试信息的输出
输出调试信息的方法
调试时打印信息有三种形式:
一是直接写打印函数
二是用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
#endif
int 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__)
#endif
int 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 );
}