Chinaunix首页 | 论坛 | 博客
  • 博客访问: 477609
  • 博文数量: 63
  • 博客积分: 1485
  • 博客等级: 上尉
  • 技术积分: 596
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-21 14:49
文章分类

全部博文(63)

文章存档

2018年(8)

2017年(25)

2016年(10)

2012年(6)

2010年(14)

我的朋友

分类: LINUX

2016-07-29 16:02:48

这不是什么新东西。岁数大了,细节的东西总记不住。记录一下,方便查阅。
主要涉及到 "#" 和 "##" 在宏里面的用法。

1.  ##的用例
完整的系统肯定会包含日志,一般来说,日至也会分几个等级,例如:info/trace/debug/warn/err

为了方便操作,没有哪个工程会鼓励这样写:
  1. printf("ERR %08d %s: this is an err, and err code is: %d.\n", getpid(), __TIME__, errno);
可以定义通用的函数,也可以通过定义宏来控制。
  1. #define LOG_ERROR(format,...) {\
  2. printf("ERR %08d %s: " format, getpid(), __TIME__, __VA_ARGS__);}
于是,程序中就可以这样调用了:
  1. LOG_ERROR("This is an error %d.\n", errno);

但是,如果程序中有了下面的调用,编译会包错:
  1. LOG_ERROR("This is an error\n");
原因是,这里只有"format"部分,而并没有__VAR_ARGS__部分。

这可以通过如下的宏定义来解决:
  1. #define LOG_ERROR(format,...) {\
  2. printf("ERR %08d %s: " format, getpid(), __TIME__, ## __VA_ARGS__);}

另外,觉得挺有意思的是,下面的代码也能工作,以前从未这么写过。
  1. printf("AA" "BB");

2. #的用例

操作系统会用宏定义一些错误码,这个大家都清楚。错误的时候,返回一个码,但是有时候记不住那些数字对应的是什么宏。。。
最近在mainframe(大型机)上写代码,哎呀,上面的错误码一堆,而且没谁能记住。。。
怎么办,写个小程序,把知道的宏以都列出来,用的时候查一下。

这个程序很简单,但是很烦,总要写成:

  1. printf("__AAA__: %d\n", __AAA__); /* 假定__AAA__是一个宏 */
那有上百个,挨个这么粘贴太费劲,一行上要搞两次。。。

于是写了个宏来做这件事情:
  1. #define PRINT_MACRO(CODE) printf("%s: %d.\n", #CODE, CODE)
于是代码就可以这么写了,配上vim列操作,很容易的:-)
  1. PRINT_MACRO(__AAA__);
  2. PRINT_MACRO(__BBB__);
输出结果就是:
  1. __AAA__: 1.
  2. __BBB__: 2.







阅读(2320) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~