boost :: format vs sprintf

时间:2012-06-13 05:48:16

标签: c++ boost

哪一个更好:boost::formatsprintf? 我也想知道哪一种更安全使用。

我知道sprintf的一个限制是它格式化char[]个对象,char[]的大小应足以容纳格式化的字符串。但boost::format是否也有同样的限制。任何人都可以在网上向我指出一份文件,我将参考boost::formatsprintf之间的差异。

3 个答案:

答案 0 :(得分:6)

在稳健性和类型安全性提升方面::格式是一个明显的赢家。它没有缓冲区大小的问题,因为它使用动态流。参数的类型保留在函数调用中,因此格式化程序可以智能地转换。这也意味着不存在使用不匹配类型拧紧堆栈的问题。此模型中也提供类型转换。

格式的缺点是它的速度和它有点麻烦。对于sprintf可以处理的格式,它的速度比sprintf的速度要低很多。它的语法也比快速调用sprintf更复杂。

对于简单的令牌格式,我通常使用sprintf。对于复杂的字符串格式化,我倾向于使用boost格式或iostreams。

答案 1 :(得分:2)

sprintf()不是类型安全的;因此boost::format将更加类型安全。 sprintf()容易出现缓冲区溢出;你最好使用snprintf()而不是sprintf(),但使用boost::format时,你很可能会更好。

答案 2 :(得分:1)

这取决于你如何定义"更好"。

printf非常快速且随时可用作标准库的一部分。但是,它有一些安全问题,在某种程度上可以通过GCC中的__attribute__ ((format (printf, ...))解决。

Boost格式是安全的,但它是much slower,正如@edA-qa mort-ora-y所指出的那样,由于非常规使用operator%而使用起来有点麻烦。

如果您想要两全其美,方便的函数调用格式API和printf的速度以及Boost格式的安全性,请考虑{fmt}库。它支持printf和Python的str.format语法:

fmt::print("Hello, {}!", "world");  // uses Python-like format string syntax
fmt::printf("Hello, %s!", "world"); // uses printf format string syntax

免责声明:我是{fmt}

的作者