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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:36:37