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

如何在运行时使用fmt库动态格式化规格?兼容现代GCC

关于运行时格式化规格调用fmt库的问题及代码兼容解决方案

核心结论

完全可以使用运行时计算得出的格式化规格调用fmt库,只需适配fmt库的编译期检查机制即可。

代码在现代GCC中失效的原因

你的示例代码在GCC 10中能正常运行,但在现代GCC版本中报错,本质是fmt库版本更新带来的编译期格式字符串检查机制变化:

  • 对应GCC 10的早期fmt库版本,默认允许传入运行时生成的格式字符串;
  • 后续fmt库(如9.0+版本)引入了强制编译期格式字符串检查,要求格式参数必须是编译期常量,以此提升性能和安全性。现代GCC版本搭配的fmt库默认启用该检查,直接传入运行时生成的const char*会触发编译错误。

修复方案

使用fmt::runtime()包装运行时生成的格式字符串,明确告诉fmt库跳过编译期检查,改为运行时解析格式:

修改后的代码如下:

#include <fmt/format.h>

const char* get_spec(bool test)
{
    return test ? "->{}" : "{}<-";
}

int main() {
    const char* non_constexpr = get_spec(true);
    fmt::print(fmt::runtime(non_constexpr), 1);
}

补充说明

  • 如果场景允许格式字符串在编译期确定,建议保留编译期检查以获得更好的性能和错误提示;
  • fmt::runtime()的作用是将格式字符串的解析延迟到运行时,完全适配动态生成格式规格的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:17:11