どちらが良いですか:boost::format
またはsprintf
?また、どちらがより安全に使用できるか知りたいです。
オブジェクトをsprintf
フォーマットするという制限が1つあり、フォーマットされた文字列を保持するのに十分なサイズである必要があります。しかし、同じ制限があるかどうかもわかりません。との違いについて参照するネット上のドキュメントを誰かが私に指摘できますか?char[]
char[]
boost::format
boost::format
sprintf
堅牢性と型安全性の観点から、boost::formatは明らかに勝者です。動的ストリームを使用するため、バッファサイズの問題はありません。パラメーターのタイプは関数呼び出しで保持されるため、フォーマッターはインテリジェントに変換できます。これは、タイプが一致しないスタックを台無しにする問題がないことも意味します。このモデルでは型変換も利用できます。
フォーマットの欠点は、その速度と少し面倒なことです。その速度は、sprintfが処理できる形式のsprintfの速度よりもかなり低速です。その構文は、sprintfのクイック呼び出しよりも少し複雑です。
単純なトークンのフォーマットには、通常sprintfを使用します。複雑な文字列フォーマットの場合、私はブーストフォーマットまたはiostreamを使用する傾向があります。
sprintf()
タイプセーフではありません。したがってboost::format
、よりタイプセーフになります。 sprintf()
バッファオーバーフローが発生しやすい。を使用したほうがよいでしょうがsnprintf()
、sprintf()
それでも。を使用した方がよい可能性が非常に高くなりますboost::format
。
それはあなたが「より良い」をどのように定義するかに依存します。
printf
標準ライブラリの一部であるため、非常に高速ですぐに利用できます。ただし、GCCでは__attribute__((format(printf、...))である程度対処される安全上の問題があります。
Boost Formatは安全ですが、それははるかに遅く、によって指摘されているように@edA-qa mort-ora-y
、の型破りな使用のために使用するのがやや面倒ですoperator%
。
便利な関数呼び出しフォーマットAPIとの速度printf
、およびBoost Formatの安全性の両方の長所が必要な場合は、{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}の作者です