转自: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. erlang的随机数 及 random:uniform()函数

    每次调用会更新进程字典里的random_seed变量,这样在同一个进程内每次调用random:uniform()时,随机数种子都不同,所以生成的随机数都不一样(调用完random:uniform()后 ...

  2. ch.poweredge.ntlmv2-auth

    <dependency> <groupId>ch.poweredge.ntlmv2-auth</groupId> <artifactId>ntlmv2- ...

  3. ZOJ 3502 Contest <状态压缩 概率 DP>

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3502 #include <iostream> #incl ...

  4. nexus-2.11.4-01-bundle.tar.gz 下载地址

    wget http://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.11.4-01-bundle.tar.gz 注意原本的是ht ...

  5. $CLASS('page__hd')[0].style.backgroundColor="red"

    const $ID = (p) => document.getElementById(p)const $CLASS = (p) => document.getElementsByClass ...

  6. adjA=(detA)A-1

    A–>adjA 连续性 反函数

  7. 题解 P4799 【[CEOI2015 Day2]世界冰球锦标赛】

    题解 P4799 [[CEOI2015 Day2]世界冰球锦标赛] 双向搜索好题 传送门 实际上,双向搜索就是把\(a^n\)的复杂度转变成了大多为\(O(nlogna^{\frac{n}{2}})\ ...

  8. 我的Android进阶之旅------>直接拿来用!最火的Android开源项目

    转载于CSDN,相关链接如下: http://www.csdn.net/article/2013-05-03/2815127-Android-open-source-projects http://w ...

  9. linux安装mongodb,设为全局和后台启动

    curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.5.tgz # 下载 tar -zxvf mongodb-linux ...

  10. View 视图动画基础