关于嵌套宏的使用
2011-12-04 wcdj 问题 :下面通过宏定义实现一个可以指定前缀的字符串。 PREFIX+".%d" 方法1 :使用#运算符。出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。 #include<cstdio> #define PREX 1.3.6 #define FORMAT(n) #n".%d\n" int main() { int ival = 246; printf(FORMAT(PREX), ival);// PREX.246 return 0; } 但是输出结果是:PREX.246,和预期的结果不一样,宏PREX作为宏FORMAT的参数并没有替换。那么如何让FORMAT宏的参数可以替换呢? 首先,C语言的宏是允许嵌套的,其嵌套后,一般的展开规律像函数的参数一样:先展开参数,再分析函数,即由内向外展开。但是,注意: (1) 当宏中有#运算符时,参数不再被展开; (2) 当宏中有##运算符时,则先展开函数,再展开里面的参数; PS: ##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号(非字符串)。 方法2 :修改宏定义的格式,再添加一个中间宏TMP(x)实现对参数的替换,然后再替换为最终想要的字符串。 #define PREX 1.3.6 #define FORMAT(x) TMP(x)