这不是什么新东西。岁数大了,细节的东西总记不住。记录一下,方便查阅。
主要涉及到 "#" 和 "##" 在宏里面的用法。
1. ##的用例
完整的系统肯定会包含日志,一般来说,日至也会分几个等级,例如:info/trace/debug/warn/err
为了方便操作,没有哪个工程会鼓励这样写:
-
printf("ERR %08d %s: this is an err, and err code is: %d.\n", getpid(), __TIME__, errno);
可以定义通用的函数,也可以通过定义宏来控制。
-
#define LOG_ERROR(format,...) {\
-
printf("ERR %08d %s: " format, getpid(), __TIME__, __VA_ARGS__);}
于是,程序中就可以这样调用了:
-
LOG_ERROR("This is an error %d.\n", errno);
但是,如果程序中有了下面的调用,编译会包错:
-
LOG_ERROR("This is an error\n");
原因是,这里只有"format"部分,而并没有__VAR_ARGS__部分。
这可以通过如下的宏定义来解决:
-
#define LOG_ERROR(format,...) {\
-
printf("ERR %08d %s: " format, getpid(), __TIME__, ## __VA_ARGS__);}
另外,觉得挺有意思的是,下面的代码也能工作,以前从未这么写过。
2. #的用例
操作系统会用宏定义一些错误码,这个大家都清楚。错误的时候,返回一个码,但是有时候记不住那些数字对应的是什么宏。。。
最近在mainframe(大型机)上写代码,哎呀,上面的错误码一堆,而且没谁能记住。。。
怎么办,写个小程序,把知道的宏以都列出来,用的时候查一下。
这个程序很简单,但是很烦,总要写成:
-
printf("__AAA__: %d\n", __AAA__); /* 假定__AAA__是一个宏 */
那有上百个,挨个这么粘贴太费劲,一行上要搞两次。。。
于是写了个宏来做这件事情:
-
#define PRINT_MACRO(CODE) printf("%s: %d.\n", #CODE, CODE)
于是代码就可以这么写了,配上vim列操作,很容易的:-)
-
PRINT_MACRO(__AAA__);
-
PRINT_MACRO(__BBB__);
输出结果就是:
阅读(2324) | 评论(0) | 转发(0) |