modernize-use-std-format

将对 absl::StrFormat 的调用(或通过配置选项的其他函数调用)转换为 C++20 的 std::format(或通过配置选项的另一个函数),适当地修改格式字符串,并删除现在不再必要的 std::string::c_str()std::string::data() 调用。

例如,它将以下代码行

return absl::StrFormat("The %s is %3d", description.c_str(), value);

转换为

return std::format("The {} is {:3}", description, value);

该检查使用与 modernize-use-std-print 相同的格式字符串转换算法,其缺点和与宏结合使用时的行为在该检查的文档中描述。

选项

StrictMode

当设置为 true 时,该检查将在从可变参数函数转换和打印带符号或无符号整型(包括来自 <cstdint>ptrdiff_tsize_tssize_t 的定宽整型)时添加强制类型转换,只要它们具有相反的符号,以确保输出与接受 C 风格可变参数列表的 std::sprintf 的简单包装器的输出相匹配。例如,在启用 StrictMode 时,

extern std::string strprintf(const char *format, ...);
int i = -42;
unsigned int u = 0xffffffff;
return strprintf("%u %d\n", i, u);

将被转换为

return std::format("{} {}\n", static_cast<unsigned int>(i), static_cast<int>(u));

以确保输出将继续是 -42 的无符号表示和 0xffffffff 的有符号表示(通常分别为 4294967254 和 -1)。当设置为 false(默认值)时,这些强制类型转换将不会被添加,这可能会导致输出发生变化。请注意,此选项对于 StrFormatLikeFunctions 的默认值没有影响,因为 absl::StrFormat 接受函数参数包,而不是可变参数函数。

StrFormatLikeFunctions

一个用分号分隔的(完全限定的)函数名列表,需要替换这些函数,前提是第一个参数包含 printf 风格的格式字符串,并且要格式化的参数紧随其后。支持限定的成员函数名,但替换函数名必须是不限定的。此选项的默认值为 absl::StrFormat

ReplacementFormatFunction

将用于替换由 StrFormatLikeFunctions 选项设置的函数的函数,而不是默认的 std::format。预计该函数提供的接口与 std::format 兼容。合适的候选者是 fmt::format

FormatHeader

必须包含 ReplacementFormatFunction 声明的头文件,以便根据需要添加 #include 指令。如果 ReplacementFormatFunctionstd::format,则此选项将默认为 <format>,否则此选项将默认为空,并且不会添加 #include 指令。