_In_および_Out_(注:_in_/_outあなたが書いたように_も、__In__/__Out__他の回答で書かれたように二重アンダースコアも付けない)は、いわゆるSAL注釈です。これらは/analyzeコンパイラオプションとともに使用でき、生のCバッファとポインタでのバッファオーバーランなどのバグや問題を特定するのに役立ちます。SALに関するMSDNドキュメントに加えて、このブログ投稿も読むことができます。
皮肉なことに(そして間違って)誰かがそれを書いた:
「他の世界では、入力はconstポインターですが、それは単純すぎると思います。:)」
SALがそれよりも強力であるという事実を見逃しています。実際、SALを使用すると、宛先バッファーの最大サイズを指定して、宛先バッファーのサイズが含まれているパラメーターを指定することもできます。たとえば、ヘッダーを開くと、 (のUnicodeバージョン)に<strsafe.h>使用される実際のSALアノテーションは次のようになっていることがわかります。StringCbPrintfWStringCbPrintf
STRSAFEAPI
StringCbPrintfW(
__out_bcount(cbDest) STRSAFE_LPWSTR pszDest,
__in size_t cbDest,
__in __format_string STRSAFE_LPCWSTR pszFormat,
...)
{
....
__out_bcount(cbDest)パラメーターに適用されたSALアノテーションが、これが出力バッファー()pszDestへのポインターであることをどのように指定しているかに注意してください。サイズはパラメーターによってバイト()で表されます。ご覧のとおり、これは豊富な注釈です(単純な「」または「非」よりも豊富です)。__out_bcountcbDestconstconst
私の意見では、SALは、独自のサイズなどを知っている、などの堅牢なコンテナクラスを使用してC ++コードを作成する場合は役に立たないです。しかし、SALは、生のポインタを使用するC風のコード(いくつかのWin32 APIなど)で役立ちstd::vectorます。std::string
あなたの質問の2番目の部分について:
StringCbPrintf「すでに持っているのになぜ必要なのかsprintf」
主な理由はsprintf、安全ではなく、バッファオーバーランが発生しやすい関数であるということです。代わりにStringCbPrintf、宛先バッファの最大サイズを指定する必要があります。これにより、バッファオーバーラン(セキュリティの敵)を防ぐことができます。