Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232003
  • 博文数量: 37
  • 博客积分: 933
  • 博客等级: 军士长
  • 技术积分: 511
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-16 10:15
文章分类
文章存档

2012年(1)

2011年(36)

分类: C/C++

2011-04-21 14:32:19

大多数程序员都熟悉预处理器,但是在内核里面使用了两个不经常看到的结构,需要说明一下。
 
对于这个用法可以这样描述:由于出现在字符串的宏参数不会被替换
  1. #define warning(text) printf("Warning text \n")

因为上述代码中,已经把text当成字符串的一部分了,所以不会出现参数替换。但是我们想要的不是这样的效果,我们想打印出 Waring:text中text指定的事件。如何办到呢?

这时就涉及到了 宏参数的字符串化(stringification)

  1. #define warning(text)\
  2.       printf("Warning:" #text "\n")

此时,会把参数text指定的内容转化为相应的字符串,并打印。

2)宏参数的连接问题,根据指定的参数,定制相应的函数名。

  1. #define funname(type,io) type##_io##_func()

这样就可以根据我们指定的宏参数类型生成我们想要的函数名称。

  1. #include<stdio.h>
  2. #define warning(text)\
  3.         printf("zhang:" #text "liang\n")
  4. #define funname(type,io) type##_io##_func()
  5. int funname(int,output)
  6. {
  7.         printf("int ....output\n");
  8. }
  9. int main()
  10. {
  11.         warning(xxxx);
  12.         funname(int,output);

  13. }

gcc -E 预处理后的结果:

  1. int int_io_func()
  2. {
  3.  printf("int ....output\n");
  4. }
  5. int main()
  6. {
  7.  printf("zhang:" "xxxx" "liang\n");
  8.  int_io_func();

  9. }
你还费解吗?
阅读(1620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~