You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:45:25