如何在printf中搭配使用原始字符串字面量R与定宽整数类型格式宏
问题根因
原始代码报错、输出不符合预期的核心原因有两个:
- 原始字符串字面量内部不会触发宏展开,
PRId64这类格式宏必须写在原始字符串外部,靠C++相邻字符串字面量自动拼接规则组合成最终格式串,原代码拆分位置错误:把数字占位符后闭合的双引号放在了PRId64前面,拼接后占位符变成%"lld(以64位Linux为例),%和格式字符之间多了引号,printf无法识别。 - 如果原始字符串的结束标记
)"后直接紧跟字母、下划线等标识符起始字符,预处理器会误判为自定义分隔符的原始字符串语法,触发语法错误,宏和原始字符串结尾之间需要保留空格。
正确可运行实现
不需要用任何转义序列,仅靠原始字符串拆分+自动拼接即可实现,完整代码如下:
#include <cstdio> #include <cstdint> #include <cinttypes> int main() { std::int64_t num = INT64_MAX; // 拆分逻辑:第一部分原始字符串到%结束,拼接PRId64宏,再拼接包含闭合引号的原始字符串 std::printf(R"("name":"%s", "number":"%)" PRId64 R"(")", "david", num); return 0; }
拼接逻辑说明
三个字面量会被预处理器自动拼接为最终格式串:
- 第一个原始字符串
R"("name":"%s", "number":"%)"的实际内容:"name":"%s", "number":"% - 宏
PRId64展开后为对应平台的64位有符号整数格式串,比如x86_64 Linux下为"lld" - 第二个原始字符串
R"(")"的实际内容:"
拼接后最终传给printf的格式串为:"name":"%s", "number":"%lld",完全符合格式要求。
运行代码后输出和预期完全一致:
"name":"david", "number":"9223372036854775807"
内容的提问来源于stack exchange,提问作者ontherocks
相关产品推荐
相关产品推荐

