C语言嵌套宏的展开规则

如题所述

第1个回答  2022-08-17

一般的宏嵌套展开规则是 由内向外 ,先将内层宏展开,再把外层宏展开:

输出:

嵌套宏 B(A(2)) 会先展开为 B((2 + 5)) ,然后再展开为 ((2 + 5) * 5) ,所以最终结果为35

如果宏的参数直接带有 # ,则不会展开内层的嵌套宏

输出:

因为 STR 宏的参数直接带有 # ,所以 STR 内部嵌套的内容不会被进一步展开,故 STR(ADD(3, 4)) 输出为 ADD(3, 4) ;

因为 TO_STR 宏的内容并没有 # ,所以嵌套的宏 ADD(3, 4) 依旧可以展开,故 TO_STR(ADD(3, 4)) 输出结果为 (3 + 4) ;

如果宏的参数直接带有 ## ,则会先将参数通过 ## 拼接,然后再依次进行展开

输出:

由于 DEF_VAR 中带有 ## 所以会先将里面的内容使用 ## 拼接,所以会最先展开为 TO_STR(var_PARAM(10)) ,由于展开后 PARAM(10) 已经变成了 var_PARAM(10) ,已经不是有效的宏了,所以最终再经过 TO_STR 的转换后,结果就是 var_PARAM(10)

相似回答