如何将#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
相关产品推荐
相关产品推荐

