c++cboostprintfboost-format

Why do Boost Format and printf behave differently on same format string


The Boost Format documentation says:

One of its goal is to provide a replacement for printf, that means format can parse a format-string designed for printf, apply it to the given arguments, and produce the same result as printf would have.

When I compare the output of boost:format and printf using the same format string I get different outputs. Online example is here

#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);
}

The output is:

BoostFormat: A:A:A:65

printf: 65:41:A:65

The difference is when I want to display a char as integral type.

Why there is a difference? Is this a bug or wanted behavior?


Solution

  • This is expected behaviour.

    In the boost manual it is written about the classical type-specification you uses:

    But the classical type-specification flag of printf has a weaker meaning in format. It merely sets the appropriate flags on the internal stream, and/or formatting parameters, but does not require the corresponding argument to be of a specific type.

    Please note also, that in the stdlib-printf call all char arguments are automatically converted to int due to the vararg-call. So the generated code is identical to:

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

    This automatic conversion is not done with the % operator.