预处理器技巧之 # 和 ##

1677阅读 0评论2011-04-21 zhangliangfnst
分类:C/C++

大多数程序员都熟悉预处理器,但是在内核里面使用了两个不经常看到的结构,需要说明一下。
 
对于这个用法可以这样描述:由于出现在字符串的宏参数不会被替换
  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. }
你还费解吗?
上一篇:如何将指向链表的指针转化为指向宿主结构体的指针
下一篇:用KGDB进行内核调试 Vmware KGDB