题目:宏定义高级应用----字符连接##
看到一哥们在TI DSP程序中写了如下宏定义:
#define ADDR(x) ((volatile unsigned int *)(0x900##x##0004))
很不解“ ## ”是干吗用的,于是问之,真是三人行必有我师,又学到了一手……
这是字符连接,在程序中如果调用ADDR(1),则等价于0x90010004……
这种宏定义的字符连接应该是通用的,因此百度关键字“宏定义 字符连接”,会查到很多相关条目,写的较详细的如下:(
http://blog.csdn.net/ch209209/article/details/6395129)
今天看webkit的代码,于是也照个模仿两个,没想到,结果和想的不一致,遂查找原因。
#define ENABLE(FATURE) DEFINE_##FATURE_ENABLE
在函数中ENABLE(HELLO)
期望有 DEFINE_HELLO_ENABLE
但是却没有出现。
这是为什么呢,经过几轮测试之后 ,我得出结论,宏展开的时候 , #define ENABLE(FATURE)
没有找到宏的参数,也就是宏的参数展开不正确,这应该与编译器的特性有关。
怎么解决这个问题呢
只需要让编译器找到正确的宏参数,就可以了
#define ENABLE(FATURE) DEFINE_##FATURE##_ENABLE
这里还是要深入理解##在宏中的作用。
宏不区分大小写 (编译环境gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2))
#include "stdio.h"
#define Declear(task,event) int Task##task[event]
Declear(3,2) = {1,2};
int main(int argc,char *argv[])
{
printf("%d",task3[1]);
return 0;
}
~
编译不通过,
此文解释的较为详细,由其应用环境也可知宏定义的字符连接应该具有通用性……