DSP

宏定义高级应用----字符连接##(应用环境CCS)

2019-07-13 19:37发布

题目:宏定义高级应用----字符连接##   看到一哥们在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;
}
~  
编译不通过,   此文解释的较为详细,由其应用环境也可知宏定义的字符连接应该具有通用性……