7

Boost 格式文档说:

它的目标之一是提供 printf 的替代品,这意味着 format 可以解析为 printf 设计的格式字符串,将其应用于给定的参数,并产生与 printf 相同的结果。

当我使用相同的格式字符串比较 boost:format 和 printf 的输出时,我得到不同的输出。在线示例在这里

#include <iostream>
#include <boost/format.hpp>

int main()
{
    boost::format f("BoostFormat:%d:%X:%c:%d");

    unsigned char cr =65; //'A'
    int cr2i = int(cr);

    f % cr % cr % cr % cr2i;

    std::cout << f << std::endl;
    printf("Printf:%d:%X:%c:%d",cr,cr,cr,cr2i);
}

输出是:

升压格式: A:A:A:65

打印:65:41:A:65

不同之处在于我想将 char 显示为整数类型。

为什么有区别?这是一个错误还是想要的行为?

4

2 回答 2

6

这是预期的行为。

boost 手册中,它是关于您使用的经典类型规范的:

但是 printf 的经典类型规范标志在格式上的含义较弱。它只是在内部流上设置适当的标志,和/或格式化参数,但不要求相应的参数是特定类型。

另请注意,在 stdlib-printf 调用中,由于 vararg调用,所有char参数都会自动转换为。int所以生成的代码等同于:

printf("Printf:%d:%X:%c:%d",cr2i,cr2i,cr2i,cr2i);

这种自动转换不是由%操作员完成的。

于 2015-11-20T09:44:53.850 回答
0

除了接受的答案

这也发生在类型参数wchar_t以及unsigned short其他等效类型上,这可能是出乎意料的,例如,当使用 Windows API 中的结构成员时(例如, ),由于历史原因SYSTEMTIME,这些结构的类型是短整数。WORD

如果您在遗留代码中使用 Boost 格式作为替代printf和“类似 printf”的函数,您可以考虑创建一个包装器,它%以这样一种方式覆盖运算符,使其转换

  • charshort_int
  • unsigned charunsigned short_unsigned int

模拟 C 变量参数列表的行为。它仍然不会 100% 兼容,但大多数剩余的不兼容性实际上有助于修复潜在的不安全代码。

较新的代码可能不应该使用 Boost 格式,而是使用 std::formatprintf.

于 2021-04-14T10:59:49.333 回答