C语言字符串化宏展开结果不符预期的解决方法及可行性咨询
C语言字符串化宏展开结果不符预期的解决方法及可行性咨询
嗨,我来帮你搞定这个问题~
你遇到的问题其实是C预处理器里#运算符的特性导致的:当你直接用#对宏参数进行字符串化时,预处理器不会先展开参数里的表达式,而是直接把传入的原始文本转成字符串,所以STR(5+6)就直接变成了"5+6",而不是先计算出11再转字符串。
不过别担心,用两层宏嵌套就能解决这个问题,而且C和C++都支持这种写法。具体代码如下:
#define STR_HELPER(x) #x #define STR(x) STR_HELPER(x)
为什么这样就能行?这是因为预处理器的宏展开规则:当宏参数被传递给另一个没有用#或##修饰的宏时,会先展开这个参数。所以当你调用STR(5+6)时,预处理器会先处理外层的STR(x),把x替换成5+6,然后调用STR_HELPER(5+6)——这时候STR_HELPER的参数x没有被#修饰,所以预处理器会先把5+6展开计算成11,最后再用#x把11字符串化,得到你想要的"11"。
你可以试试这个写法,完全符合你的需求,不管是C还是C++环境下都能正常工作哦~
备注:内容来源于stack exchange,提问作者hopy




