转载自:http://www.cppblog.com/ownwaterloo/archive/2010/08/08/74219.html
/** 问题描述:
*/
/* 定义一个带参数的宏
*/
#define setname(name) test##name
/* 用一段文本作为该宏的参数
*/
int setname(1212)
= 1212;
/* 该宏会被替换为:
int test1212 = 1212;
*/
/* 现在有另一个宏
*/
#define var 326
/* 如何使用让宏var,作为另一个带参数的宏setnaem的参数? 即:
int setname(var) = 326;
被替换为:
int test326 = 326
而不是:
int testvar = 326;
*/
问题分析
需要注意:
I. 宏是作文本替换
II. 替换的终止条件是:文件中不再含有宏
对第9行的:SET_NAME(1212)
1. 首先根据I和第5行,SET_NAME(1212) 会被替换成:CONNECTION(test,1212)
2. CONNECTION依然是一个宏,根据II,继续替换
3. 根据I和第4行,CONNECTION(test,1212),被替换为 test1212
4. 所以第10行最终会被CPP替换成 "int test1212 = 1212;"
对第12行的:SET_NAME(VAR)
1. 首先根据I和第5行,SET_NAME(VAR)会被替换成:CONNECTION(test,VAR)
2. CONNECTION和VAR依然是一个宏,根据II,继续替换
3. 根据I和第11行,CONNECTION(test,VAR)被替换为CONNECTION(test,326)
4. 再根据I和第4行,CONNECTION(test,326)被替换为test326
5. 所以第12行最终会被CPP替换成 "int test326 = 326;"
对第16行的:SET_NAME(VAR),同第12行,最终会被替换成 test86
为什么setname不行?
setname(var) 会被替换成 testvar,而后者不再含有宏,替换终止。