宏里面,如果对宏的参数做如下两种操作,是不会先展开参数的:
1、stringize (字符串化,也就是#操作符)
2、concatenate(拼接操作,也就是##操作符)
其他情况下都是先把参数做完全的展开。
str(s)是上面的情况1,所以str(foo)不会展开参数foo, 会变成#foo,也就是"foo",
xstr(s)不属于1、2任何之一,所以先把参数foo展开为4,会变成str(4),也就是"4"。
https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html
常用技巧就是第一层宏先展开参数,然后第二层宏把展开的参数进行1、2所说的操作。
--
FROM 114.245.195.*