C++宏中'##'运算符在'->'后无法正常工作的问题咨询
解决宏粘贴导致的编译错误问题
我来帮你拆解这个问题的根源,以及给出直接的修复方案:
问题本质
C++预处理器的##(标记粘贴运算符)有个硬性规则:它连接的两个部分必须能组合成一个合法的预处理标记,而且粘贴操作会在宏展开时优先执行。
看你第二个宏的写法:
#define MAC(type) x->##type##_value();
当调用MAC(a)时,预处理器会先处理所有##:
- 首先尝试处理
->##type,也就是把->和a强行粘在一起,形成->a——这根本不是一个合法的预处理标记(合法标记比如标识符、单独的运算符、常量等,->a是运算符加标识符的混合体,无法作为单个标记存在),所以编译器直接抛出了pasting formed '->a', an invalid preprocessing token的错误。
而第一个宏能正常运行,是因为set_##type粘贴后得到set_a(合法标识符),再和##_value粘贴成set_a_value,最终展开的x->set_a_value(val)完全符合语法规则,没有问题。
修复方案
你完全不需要在->和type之间加##,因为x->后面本来就可以直接跟标识符,只需要把type和_value粘贴起来就行。修改后的宏应该是:
#define MAC(type) x->type##_value();
调用MAC(a)时,预处理器会把type##_value粘贴成a_value,最终展开为x->a_value();,完全符合语法,编译就能顺利通过。
额外提示
使用##时一定要记住:它的作用是把两个独立的合法预处理标记,连接成一个新的合法标记,不要在本来就不需要连接的场景滥用——比如运算符和标识符之间,本来就是各自独立的标记,强行用##粘贴只会触发错误。
内容的提问来源于stack exchange,提问作者250
相关产品推荐
相关产品推荐

