如何在运行时使用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
相关产品推荐
相关产品推荐

