引言
C语言有可变参数函数
void printf(const char* format, …);
开发中用到printf的地方常常需要做一层封装,这样可以定义自己的开关,从而可以灵活控制打印。以前常用的都是封装一层函数,
void debug_printf(char * fmt,...){ ..........//定义自己的可变参数函数 if( g_debug !=0){ printf(fmt,bufptr); } return 0; }
虽然可以做到通过g_dbug全局变量的设置控制打印。但是即使关闭了打印,在程序执行过程中,依旧需要调用函数debug_printf,增加了压栈和出栈的操作。
if( g_debug !=0)的操作放在函数外面更好,但是如果直接放在外面,则每个调用处都不是一个简单语句,如果能用宏再封装一层不更好,知道最近才知道原来自从C99后就已经支持可变参数的宏定义了。
一个小例子
#define DEBUG_PRINTF(...) printf(__VA_ARGS__)
int main(){
int i = 0;
DEBUG_PRINTF("the var i = %d \n",i);
return 0;
}
保存为test.c后通过编译命令gcc -E test.c可以看到经过预处理后,宏被替换为
#define DEBUG_PRINTF(...) printf(__VA_ARGS__)
int main(){
int i = 0;
printf("the var i = %d \n",i);
return 0;
}
那么引言中提到的函数就可以写为
#define DEBUG_PRINTF(...) \ do{ \ if(g_debug != 0) { \ printf(__VA_ARGS__);\ } \ }while(0)
采用这样定以后,可以做到如果关闭了了打