2016-11-15 5 views
0

MSDNのRetrieving the Last-Error Codeのためのサンプルコードは、このコードを示していますLocalAllocに渡されるサイズに40が追加されたのはなぜですか?

StringCchPrintf((LPTSTR)lpDisplayBuf, 
    LocalSize(lpDisplayBuf)/sizeof(TCHAR), 
    TEXT("%s failed with error %d: %s"), 
    lpszFunction, dw, lpMsgBuf); 

の後半で使用されている ​​

私はが追加されていることを理由を正確に把握するのは非常に好奇心?

安全マージンはありますか?または、MicrosoftがStringCchPrintfについて教えてください。または、他の何か?

+6

'dw 'の可能な数字のすべてにスペースが必要です。また、テキストメッセージ自体も必要です。 '40'はちょっと残酷すぎるかもしれないが、あまり多くはないかもしれない。 –

+0

これは、学校のハードノックで教えられた練習です。誰かが文字列をローカライズする予定で、数字に注意を払うことを忘れないように保証されています。 StringCchPrintf()は常にトラブルから彼を保つが、ドイツでのバグレポートのために、まだいくつかのオッズます:) –

答えて

4

フォーマット文字列%s failed with error %d: %sを指定すると、21文字のテキスト(" failed with error "および": ")があります。エラーコード(0x8FFFFFFFまたは-1879048193の10進表記)の最長表示は11文字です。ヌルターミネータの文字をもう一度取ると、合計33文字と2つの入力文字列の長さが加算されます。したがって、コードは7文字分のスペースを過剰に割り当てます。著者は急いでいたことを意味します

、念のため、わずかに過剰推定すること、必要なバッファサイズを推定し、またはコードでそれを考慮しなくてエラーテキストを固定テクニカルライター。

Visual Studioを使用していて、自分で計算したくない場合は、_vsctprintfファミリのいずれかを呼び出して、CRTに指示してもらうことができます。これは書式文字列の変更に影響されないだけでなく、質問に未回答のまま残されていない点に著者の意図を記録します。

関連する問題