Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / C/C++中自定义信息输出——printf与宏的配合使用

在C/C++中,提起“宏”多少有些皱眉,至少我在入门C++时旁人好心提醒:尽可能地使用typedef与const常量定义来替代“宏”的使用:
 
1. 类型宏定义  #define HANLE void*
 //可以替换为:
 typedef void *HANLE;2. 常量定义  #define MAX_LIMIT 4096
 //可以替换为:
 const int s_MAX_LIMIT 4096;因为宏定义是在预编译阶段,对内容进行直接替换,因此无法提供安全的类型检查等功能。但我本次要说的是,宏的一个很炫的应用:配合printf函数能够方便地自定义输出格式和内容。举例来说吧,就是用户在程序中调用:USER_PRINT( "i should checkout: v_a value is %d. ", value_a );能够输出类似信息[2013-10-01 15:18:28][Fox Test][PID:2486]i should checkout: v_a value is 10.当然,如果你用过linux下的syslog,你会发现这条输出信息算是“高仿”了。syslog可是linux下调试/监控的优秀组件,简单易用不说,功能也比较完备!扯远了,本次的目标就是如何在用户简单输出一条信息的时候,我们能够同时加上各种附加信息,包括时间/用户/PID等参数,方便我们的调试/监控。C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htmC++11 获取系统时间库函数 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htmC++11中正则表达式测试 http://www.linuxidc.com/Linux/2012-08/69086.htm1. 首先,提供一个有意思的宏,该宏也是该功能的核心#define USER_PRINT_BASE( format, args... )  printf( format, ##args )是不是看到args...有点儿蒙,以及##args又是闹哪样?说明一下:i: args...是一个参数,是C/C++中定义变参函数(参数不固定)的一种格式。至于举个变参函数的例子,printf/scanf什么的就是随处可见的例子。ii: ##args是宏的一个特殊语法应用(和普通的##宏应用不同[TODO]),使得宏展开时可以去掉可能存在的多余的","。举例:当没有##时,USER_PRINT_BASE( "something debug" )在宏展开时会成为printf( "something debug", )多了一个逗号!当然,如果你调用USER_PRINT_BASE( "something debug--%d", 10 )的时候,即使没有"##"也不会出错。iii: 如果你的编译器支持C99规范,那么宏也可以改写为:#define USER_PRINT_BASE( format, ... )   printf( format, ##__VA_ARGS__ )嗯好吧,其实只是变参的书写格式发生了点变化。注:ii与iii详细的可以参考“C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用”,里面有很详细的介绍http://www.linuxidc.com/Linux/2014-06/102923.htm。更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-06/102922p2.htm