C中几个特定宏的介绍(一些调试的小技巧)
2017-08-27 15:23
239 查看
在C的调试中,有几个宏经常被使用来辅助程序员进行程序调试,这里对之进行简单介绍。
1、__FUNCTION__
该宏被用来表示调用该宏的函数。
2、__LINE__
该宏用来表示调用该宏的对应行数。
3、__TIME__
该宏用来表示调用该宏时的时间。
4、__DATE__
该宏用来表示调用该宏的日期。
5 、__FILE__
该宏用来表示调用该宏的文件。
示例程序:
# include <stdio.h>
#include <math.h>
void test(void)
{
printf("the file is %s\n", __FILE__);
printf("the date is %s\n", __DATE__);
printf("the time is %s\n", __TIME__);
printf("the line is %d\n", __LINE__);
printf("the function is %s\n", __FUNCTION__);
return ;
}
int main()
{
test();
return 0;
}
也可以通过宏定义的方式来使用上述的宏:
#define XX_DEBUG(fmt,arg...)printf("<<-XXX-DEBUG->>[%s] [%d] "fmt"\n",__FUNCTION__,__LINE__, ##arg)
但有时,打印信息太多会增加我们查找对应信息的难度,这里我介绍一下如何使自己的printf打印出有颜色的字体。
先介绍一下控制字符的通用格式:
Esc[{attr1};...{attrn}m
其中,
Esc为转移字符,其值为“\033”;
[为常量的左中括号;
{attr1};...{attrn} 是若干属性, 通常是由一个有特定意义的数字代替, 每个属性之间用分号分隔;
m 就是字面常量字符m;
因此,printf的格式便可设为如下格式:
printf("\033[字背景颜色;字体颜色m 字符串 \033[0m" );
其中 \033[0m 是对之前颜色设置的结束,恢复到终端原来的背景色和字体色,以免之前的设置改变别的printf的格式。
接下来对各种属性进行介绍:
ANSI控制码的介绍:
\033[0m 关闭所有属性 ,即终结之前的颜色设置,恢复到终端的原本背景色和字体色
\033[1m 设置高亮度
\03[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m -- \033[37m 设置前景色
\033[40m -- \033[47m 设置背景色
\033[nA 光标上移n行
\03[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\33[?25h 显示光标
颜色代码:
字背景颜色范围: 40--49 字颜色: 30—39
40: 黑 30: 黑
41: 红 31: 红
42: 绿 32: 绿
43: 黄 33: 黄
44: 蓝 34: 蓝
45: 紫 35: 紫
46: 深绿 36: 深绿
47: 白色 37: 白色
因此,debug的printf最终可改为
#define XX_DEBUG(fmt,arg...) \
printf("\033[字背景颜色;字体颜色m<<-XXX-DEBUG->>[%s] [%d]\033[0m \033[字体颜色m"fmt"\033[0m\n",__FUNCTION__,__LINE__,
##arg)
程序如下:
#include <stdio.h>
#define XX_DEBUG(fmt,arg...) \
printf("\033[41;32m <<-XXX-DEBUG->>[%s] [%d]\033[0m \033[34m"fmt"\033[0m\n",__FUNCTION__,__LINE__, ##arg)
int main()
{
XX_DEBUG("Hello,word %d",123);
printf("haha\n");
return 0;
}
运行结果如图:
![](https://img-blog.csdn.net/20170927135239770?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXdlMTU5NTQyNTA4MDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
PS:设置后的结果和终端有一定的关系。
1、__FUNCTION__
该宏被用来表示调用该宏的函数。
2、__LINE__
该宏用来表示调用该宏的对应行数。
3、__TIME__
该宏用来表示调用该宏时的时间。
4、__DATE__
该宏用来表示调用该宏的日期。
5 、__FILE__
该宏用来表示调用该宏的文件。
示例程序:
# include <stdio.h>
#include <math.h>
void test(void)
{
printf("the file is %s\n", __FILE__);
printf("the date is %s\n", __DATE__);
printf("the time is %s\n", __TIME__);
printf("the line is %d\n", __LINE__);
printf("the function is %s\n", __FUNCTION__);
return ;
}
int main()
{
test();
return 0;
}
也可以通过宏定义的方式来使用上述的宏:
#define XX_DEBUG(fmt,arg...)printf("<<-XXX-DEBUG->>[%s] [%d] "fmt"\n",__FUNCTION__,__LINE__, ##arg)
但有时,打印信息太多会增加我们查找对应信息的难度,这里我介绍一下如何使自己的printf打印出有颜色的字体。
先介绍一下控制字符的通用格式:
Esc[{attr1};...{attrn}m
其中,
Esc为转移字符,其值为“\033”;
[为常量的左中括号;
{attr1};...{attrn} 是若干属性, 通常是由一个有特定意义的数字代替, 每个属性之间用分号分隔;
m 就是字面常量字符m;
因此,printf的格式便可设为如下格式:
printf("\033[字背景颜色;字体颜色m 字符串 \033[0m" );
其中 \033[0m 是对之前颜色设置的结束,恢复到终端原来的背景色和字体色,以免之前的设置改变别的printf的格式。
接下来对各种属性进行介绍:
ANSI控制码的介绍:
\033[0m 关闭所有属性 ,即终结之前的颜色设置,恢复到终端的原本背景色和字体色
\033[1m 设置高亮度
\03[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m -- \033[37m 设置前景色
\033[40m -- \033[47m 设置背景色
\033[nA 光标上移n行
\03[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\33[?25h 显示光标
颜色代码:
字背景颜色范围: 40--49 字颜色: 30—39
40: 黑 30: 黑
41: 红 31: 红
42: 绿 32: 绿
43: 黄 33: 黄
44: 蓝 34: 蓝
45: 紫 35: 紫
46: 深绿 36: 深绿
47: 白色 37: 白色
因此,debug的printf最终可改为
#define XX_DEBUG(fmt,arg...) \
printf("\033[字背景颜色;字体颜色m<<-XXX-DEBUG->>[%s] [%d]\033[0m \033[字体颜色m"fmt"\033[0m\n",__FUNCTION__,__LINE__,
##arg)
程序如下:
#include <stdio.h>
#define XX_DEBUG(fmt,arg...) \
printf("\033[41;32m <<-XXX-DEBUG->>[%s] [%d]\033[0m \033[34m"fmt"\033[0m\n",__FUNCTION__,__LINE__, ##arg)
int main()
{
XX_DEBUG("Hello,word %d",123);
printf("haha\n");
return 0;
}
运行结果如图:
PS:设置后的结果和终端有一定的关系。
相关文章推荐
- 经验共享:介绍网卡调整过程中的 一些另类小技巧
- GCC的一些参数介绍、gdb遇到段错误的一般调试方法
- 介绍几个关于C/C++程序调试的函数
- js前端调试的几个小技巧
- 调试程序一些小技巧
- JavaWeb(二)随笔 介绍一下onchange 以及常见的一些调试技巧
- Eclipse中的一些调试小技巧
- gdb 调试c/c++的一些小技巧
- 查找错误的几个调试方法&一些C/C++的文章&一些零碎知识
- 标准C++的一些特定的返回值类型介绍(原作于08年11月20日)
- Javascript调试之console对象,它的一些小技巧你都知道吗?
- JS调试的一些小技巧
- android中handler的一些总结以及使用(二)之handle使用时用到的几个主要方法介绍
- Javascript调试之console对象――你不知道的一些小技巧
- C/C++ 程序调试的几个小技巧
- android 调试中的一些小技巧
- dbx调试工具,下面介绍一些常用的命令
- chrome调试,打完断点后关于JS的几个控制介绍
- Chrome控制台 JS调试的一些小技巧
- python 设计及调试的一些小技巧