7

Boost Format のドキュメントには次のように書かれています。

その目標の 1 つは、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

printf:65:41:A:65

違いは、char を整数型として表示する場合です。

なぜ違いがあるのですか?これはバグですか、それとも望ましい動作ですか?

4

2 に答える 2

6

これは予期される動作です。

ブーストマニュアルでは、使用する古典的な型仕様について書かれています:

しかし、printf の古典的な型指定フラグは、フォーマットではより弱い意味を持ちます。内部ストリームやフォーマット パラメータに適切なフラグを設定するだけで、対応する引数が特定の型である必要はありません。

stdlib-printf 呼び出しでは、すべてのchar引数がintvararg-call により自動的に変換されることにも注意してください。したがって、生成されたコードは次と同じです。

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

この自動変換は、%オペレーターでは行われません。

于 2015-11-20T09:44:53.850 に答える