linux c 宏 文件名,linux c 中 当前函数名 文件名 行 可变参 宏使用

在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在屏幕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值