转自:http://blog.csdn.net/edonlii/article/details/8491342/

在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难。因此在程序中加入合理的打印信息,定位错误出现的文件名,函数名,行号等信息,能更高效的定位到问题的所在。

下面定义了宏,分别是WARNING,INFO,ERROR,SHOW_TIME,DEBUG等。利用了 __FILE__,_FUNCTION__, __LINE__等变量。。。

_FILE____FUNCTION__ __LINE__ 从名字可以直接看出来了,对应的:代码文件函数 行号

下面就是定义的宏:

#define ERROR(...) /
do{ /
fprintf(stderr, "[ERROR ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stderr, __VA_ARGS__); /
}while(0) #define WARNING(...) /
do{ /
fprintf(stdout, "[WARNING]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0) #define INFO(...) /
do{ /
fprintf(stdout, "[INFO ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0) #define SHOW_TIME(...) /
do{/
extern unsigned long long gLatestTime;/
timeval tp;/
gettimeofday(&tp, NULL);/
unsigned long long now = tp.tv_sec*1000000+tp.tv_usec; /
if(gLatestTime != 0) /
{ /
fprintf(stdout, ">>>>>>>>>Used Time: %s[%d], %s: %ld.%ld, %llu ms ", __FILE__, __LINE__, __func__, tp.tv_sec, tp.tv_usec, (now-gLatestTime)/1000);/
fprintf(stdout, __VA_ARGS__); /
fprintf(stdout, "/n"); /
} /
gLatestTime = now;/
}while(0) #ifdef DEBUG
#define DBG(...) /
do{ /
fprintf(stdout, "[DEBUG ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#else
#define DBG(...)
#endif

以上是定义的输出文件信息,如果想输出自定义的字符串(类似printf()的功能),可以使用可变参的形式传递。

如上面的的最后一个DEBUG的定义:

fprintf(stdout , __VA_ARGS__);

这行代码使得用户可以将自己的信息放在可变参里面,例如:DBG("  I am from  %s " , "ICT"); 这句话的输出分成两部分,前半部分打印文件名、函数名、行号,后半部分会输出: I
am from ICT  这句话。可变参给用户提供了很好的自定义空间。

<将在下一篇博文中介绍一下" 可变参 "的用法>

说明:

        stdout -- 标准输出设备 (printf("..")) 同 stdout。 

        stderr -- 标准错误输出设备 两者默认向屏幕输出。

但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。

linux 中C语言便于调试的宏定义编写及 __FILE__,__FUNCTION__, __LINE__参数使用的更多相关文章

  1. Linux课程---11、Linux中软件安装和调试

    Linux课程---11.Linux中软件安装和调试 一.总结 一句话总结: 启动过程:1.安装软件,2.修改配置文件,3.启动服务 查看过程:4.查看进程,5.查看端口 关闭过程:6.关闭软件,7. ...

  2. C语言 预处理二(宏定义--#define)

    //#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 ...

  3. 34.Linux-printk分析、使用__FILE__, __FUNCTION__, __LINE__ 调试

    本节学习目的 1)分析printk()函数 2)使用printk()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表 ...

  4. linux中C语言发送广播报文

    2. 指令的解决方法: oute add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1 或者 route add -ho ...

  5. Linux中C语言的编程

    编译的过程 编译的概念:编译程序读取源程序(字符流),对之进行词法与语法的分析,将高级语言指令转换成功能等效的汇编代码,再由汇编程序转换成机器语言,并且按照操作系统对可执行文件格式的要求链接成可执行程 ...

  6. 【C语言】预处理、宏定义、内联函数 _

    一.由源码到可执行程序的过程 1. 预处理: 源码经过预处理器的预处理变成预处理过的.i中间文件   1 gcc -E test.c -o test.i 2. 编译: 中间文件经过编译器编译形成.s的 ...

  7. 【C语言】预处理、宏定义、内联函数

    一.由源码到可执行程序的过程 1. 预处理: 源码经过预处理器的预处理变成预处理过的.i中间文件 1 gcc -E test.c -o test.i 2. 编译: 中间文件经过编译器编译形成.s的汇编 ...

  8. Linux中ansible批量管理软件部署及剧本编写

    服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29: ...

  9. 宏定义中的反斜杠"\"和宏定义的细节说明

    转载自:http://www.wtoutiao.com/p/K6csca.html 在阅读C语言代码经常可以看到代码中出现反斜杠"\",不是很明白它的意思,遂对反斜杠"\ ...

随机推荐

  1. 初识vue-01

    一.属性和方法 vue自定义的一些数据和方法需要绑定到实例的不同属性上面去例如数据都要绑定要data属性,方法都要绑定到methods方法实例上的data和methods里面的key值会自动挂载到vu ...

  2. 13 nginx gzip压缩提升网站速度

    一:nginx gzip压缩提升网站速度 我们观察news.163.com的头信息 请求: Accept-Encoding:gzip,deflate,sdch 响应: Content-Encoding ...

  3. android的Environment类 Android存储访问及目录

    http://www.cnblogs.com/mengdd/p/3742623.html http://blog.csdn.net/barnett_zhubo/article/details/6832 ...

  4. 【React Native开发】React Native控件之RefreshControl组件具体解释(21)

    ),React Native技术交流4群(458982758)种 enabled  bool   android平台适用   用来设置下拉刷新功能是否可用 progressBackgroundColo ...

  5. 【BZOJ4237】稻草人 cdq分治+单调栈+二分

    [BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...

  6. 九度OJ 1022:游船出租 (统计)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3670 解决:1444 题目描述:     现有公园游船租赁处请你编写一个租船管理系统.当游客租船时,管理员输入船号并按下S键,系统开始计时 ...

  7. 这种实现方式比使用 += 要更节省内存和 CPU,尤其是要串联的字符串数目特别多的时候。

    这种实现方式比使用 += 要更节省内存和 CPU,尤其是要串联的字符串数目特别多的时候. package main import ( "bytes" "fmt" ...

  8. slide.js

    define(['jquery'], function (jquery) { function buildSmooth(config, motivateCallBack) { var timer = ...

  9. Linux就该这么学--Shell脚本基本应用

    1.接收用户的参数: Shell脚本为了能够让用户更灵活的完成工作需求,可以在执行命令时传递参数:(命令名 参数1 参数2...) Shell预定义变量: $0 当前执行Shell脚本的程序名 $1- ...

  10. (转).NET基础拾遗(5)多线程开发基础

    https://www.cnblogs.com/edisonchou/p/4848131.html