调整C/C++预处理器宏展开优先级问题咨询
解决C/C++预处理器宏展开优先级问题
问题根源
你的f(x)宏使用了#字符串化操作符,预处理器规则明确:字符串化操作会直接将宏参数原样转换为字符串,不会先展开参数内部的其他宏。所以f(Hello $(world))里的$(world)不会被$宏处理,直接被转成了"Hello $(world)"。
解决方案
添加一层辅助宏,让参数先完成宏展开,再进行字符串化操作。具体思路:
- 定义一个负责实际字符串化的辅助宏(比如
f_impl) - 让原
f宏调用这个辅助宏,预处理器会先展开f的参数,再传递给辅助宏做字符串化
修改后的代码如下:
#include <iostream> #include <sstream> #define $(x) << x << #define f_impl(x) (#x) #define f(x) f_impl(x) // 先展开参数x,再执行字符串化 int main() { auto world = "universe!"; std::stringstream ss; ss << f(Hello $(world)) << std::endl; std::cout << ss.str(); return 0; }
验证结果
修改后运行代码,预处理器会先将$(world)展开为<< world <<,再把Hello << world <<传递给f_impl进行字符串化,最终输出符合预期:
Hello universe!
内容的提问来源于stack exchange,提问作者code_by_cr
相关产品推荐
相关产品推荐

