在开发中我们常常需要对数据进行打印操作,这样我们才能更好的进行开发交互,进而合理开发和优化程序。
如果我们将一些输出语句直接写在程序里,在我们最后打包的时候会有许多脏数据,特别像iOS,如果想放到AppStore上去,就必须把所有输出语句删除,不然审核不会不通过,提示您的程序是调试程序。
如果我们在宏定义里对宏进行判断的话,这样就会省去很多麻烦。如:
#ifdef DEBUG
#define DDDebugLog(fmt, ...) NSLog((@"%s [Line %d]\n" fmt @"\n\n\n"), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define DDDebugLog(...)
#endif
在上述宏定义中,如果DEBUG被定义了,那么就会执行上面的define定义,如果不是DEBUG那么就会执行下面的define定义。这样,在代码中只要判断是不是debug就可以了,方便操作,一次性解决调试与打包两种状态下的程序。
#define DDDebugLog(fmt, ...) NSLog((@"%s [Line %d]\n" fmt @"\n\n\n"), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
__VA_ARGS__ 是一个可变参数的宏(gcc支持)。实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串。加##用来支持0个可变参数的情况。
测试代码:
#include
#define PRINT_DBG(debug, ...)\
{\
if(debug) {\
fprintf(stderr, "%s %s [%d]: ", __FILE__, __FUNCTION__, __LINE__);\
fprintf(stderr, __VA_ARGS__);\
}\
}
#define MACRO(s, ...) printf(s, ##__VA_ARGS__)
int main()
{
int i =100;
PRINT_DBG(1,"hello\n");
PRINT_DBG(1,"world, %d\n",i);
MACRO("hello, world\n"); //这里没有可变参数, 所以要用##__VA_ARGS__
MACRO("hello, %s\n", "fanrey");
return 0;
}
编译:gcc -o vaargs vaargs.c
运行: ./vaargs
vaargs.c main [16]: hello
vaargs.c main [17]: world, 100
hello, world
hello, fanrey