大多数程序员都熟悉预处理器,但是在内核里面使用了两个不经常看到的结构,需要说明一下。
对于这个用法可以这样描述:由于出现在字符串的宏参数不会被替换
- #define warning(text) printf("Warning text \n")
因为上述代码中,已经把text当成字符串的一部分了,所以不会出现参数替换。但是我们想要的不是这样的效果,我们想打印出 Waring:text中text指定的事件。如何办到呢?
这时就涉及到了 宏参数的字符串化(stringification)
- #define warning(text)\
- printf("Warning:" #text "\n")
此时,会把参数text指定的内容转化为相应的字符串,并打印。
2)宏参数的连接问题,根据指定的参数,定制相应的函数名。
- #define funname(type,io) type##_io##_func()
这样就可以根据我们指定的宏参数类型生成我们想要的函数名称。
- #include<stdio.h>
- #define warning(text)\
- printf("zhang:" #text "liang\n")
- #define funname(type,io) type##_io##_func()
- int funname(int,output)
- {
- printf("int ....output\n");
- }
- int main()
- {
- warning(xxxx);
- funname(int,output);
- }
gcc -E 预处理后的结果:
- int int_io_func()
- {
- printf("int ....output\n");
- }
- int main()
- {
- printf("zhang:" "xxxx" "liang\n");
- int_io_func();
- }
你还费解吗?
阅读(1616) | 评论(0) | 转发(0) |