1

我正在尝试std::string使用 fmtlib 获得 ISO 时间。考虑以下代码:

const auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
const auto creation_time = fmt::format("{:%FT%T%z}", fmt::localtime(t));

我收到以下错误:

../deps/fmt-src/include/fmt/chrono.h: 在函数'size_t fmt::v7::detail::strftime(char*, size_t, const char*, const tm*)': ../ deps/fmt-src/include/fmt/chrono.h:377:48:错误:格式不是字符串文字,格式字符串未检查 [-Werror=format-nonliteral] 返回 std::strftime(str, count, format,时间);

我不明白,显然fmt::localtime(t)不是编译时字符串。

我错过了什么?

使用 fmtlib v7.1.3,使用以下标志编译以在嵌入式系统上工作:

target_compile_definitions(fmt PRIVATE FMT_STATIC_THOUSANDS_SEPARATOR FMT_USE_DOUBLE=0 FMT_USE_LONG_DOUBLE=0)
4

1 回答 1

2

问题是您正在使用-Werror=format-nonliteral编译器标志进行编译,而 chrono 格式化程序strftime使用动态格式字符串调用。解决方案是删除-Werror=format-nonliteral或添加-Wno-error=format-nonliteral.

或者,您可以使用 {fmt} 5a37e1或更高版本来抑制此警告。

于 2021-04-04T14:36:56.400 回答