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

如何将#define的精确字面量存入字符串以便打印输出

解决方案:利用预处理器字符串化宏实现

要获取#define宏的原始字面量,核心是借助C++预处理器的字符串化操作符#,但必须通过两层嵌套宏实现"先展开宏定义,再字符串化"——直接用一层宏只会把宏名转成字符串,达不到需求。

步骤1:定义辅助宏

先写两个嵌套宏,完成"宏展开→字符串化"的流程:

#define STRINGIFY_HELPER(x) #x
#define STRINGIFY(x) STRINGIFY_HELPER(x)
  • 内层STRINGIFY_HELPER通过#x把输入内容直接转为字符串;
  • 外层STRINGIFY会先将参数x对应的宏展开成它的定义值,再传给内层宏处理。

步骤2:修改测试代码

用上述宏替换直接赋值,即可得到和宏定义完全一致的字符串:

#define intgr 12
#define bnry 0b00000001
#define hex 0x0A
#define str "Hello World"

#define STRINGIFY_HELPER(x) #x
#define STRINGIFY(x) STRINGIFY_HELPER(x)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string myStr;

    myStr = STRINGIFY(intgr);
    cout << myStr << endl;  // 输出:12(符合预期)

    myStr = STRINGIFY(bnry);
    cout << myStr << endl;  // 输出:0b00000001(符合预期)

    myStr = STRINGIFY(hex);
    cout << myStr << endl;  // 输出:0x0A(符合预期)

    myStr = STRINGIFY(str);
    cout << myStr << endl;  // 输出:"Hello World"(符合预期,带引号)

    return 0;
}

为什么要用两层宏?

如果直接写#bnry,预处理器会把它转换成字符串"bnry"而非"0b00000001"。外层宏STRINGIFY(x)会先触发预处理器展开x的宏定义,再把展开后的结果传给内层宏做字符串化,这样才能拿到宏的原始字面量。

内容的提问来源于stack exchange,提问作者Jake quin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:20:53