L“%s”のようなワイド文字列の問題を見つける最良の方法は何ですか?
-
16-09-2019 - |
質問
ここで私が言いたい頭の痛い問題の例を示します。
画面にテキストをレンダリングするために主に Unicode 文字列を使用するマルチプラットフォーム プロジェクトがあります。VC++ の Windows では、次の行が表示されます。
swprintf(swWideDest, LEN, L"%s is a wide string", swSomeWideString);
正常にコンパイルされ、ワイド文字列を他のワイド文字列に出力します。ただし、実際には次のようにする必要があります。
swprintf(swWideDest, LEN, L"%ls is a wide string", swSomeWideString);
「%s」を「%ls」に置き換えないと、これは他のプラットフォームでは機能しません。Windows 上の環境でのテストは、デバッグが簡単、迅速、そしてはるかに簡単であるためです。この種のバグは見過ごされがちです。
最善の解決策は、最初に正しいコードを書くことであることはわかっていますが、プレッシャーがかかると単純な間違いが発生し、特に今回のケースでは、その間違いが長い間気づかれない可能性があります。
この種のバグには多くのバリエーションがあると思いますが、私たちはまだそれを楽しんでいません。
この種のバグを見つけるための優れた方法を持っている人はいますか?
:D
解決
の機能は何もないので、 *printf
家族はあなたもタイプセーフです
- 正規表現を使用してエラーの可能性を検索し、手動で修正します
- おそらく文字列ストリームに基づいた、タイプセーフな別のアプローチを使用するか、 ブースト.フォーマット
他のヒント
見てみるといいかもしれません 高速フォーマット Boost.Format がニーズに対して遅すぎる場合に備えて。
stringstream と Boost.Format との比較:
- IOストリーム:fastformat.formatは、ioStreamsよりも高速で、すべての場合に100〜900%です
- ブーストフォーマット:fastformat.formatは、boost.formatよりも高速で、すべての場合において、〜400-1650%の間です
所属していません StackOverflow