_In_
和_Out_
(注:既不_in_/_out
_爲你寫,也不__In__/__Out__
雙下劃線,寫在一些其他的答案)是所謂的SAL註釋。它們可以與/analyze
編譯器選項一起使用,並且可以使用原始C緩衝區和指針幫助識別錯誤和問題,如緩衝區溢出等。除了MSDN documentation on SAL,您還可以閱讀這個blog post。
有人諷刺意味的是(和錯誤)寫道:
「在世界其他地方,輸入是const的指針,但我想這 太簡單了:)。」
錯過了SAL是比這更強大的事實。實際上,對於SAL,您還可以指定目標緩衝區的最大大小,指示哪個參數包含目標緩衝區大小;例如如果你打開<strsafe.h>
頭,你可以讀取用於StringCbPrintfW
(Unicode版本的StringCbPrintf
)實際SAL註釋是類似的東西:
STRSAFEAPI
StringCbPrintfW(
__out_bcount(cbDest) STRSAFE_LPWSTR pszDest,
__in size_t cbDest,
__in __format_string STRSAFE_LPCWSTR pszFormat,
...)
{
....
注意應用於pszDest
參數__out_bcount(cbDest)
SAL註釋是如何指定這個是一個指向輸出緩衝液(__out
),其大小由參數cbDest
表示以字節爲單位(_bcount
)。正如你所看到的,這是一個豐富註釋(不是簡單的「const
」富裕或「非const
」)。
在我看來,SAL是一種無用的,如果你寫C++代碼具有強大的容器類,如std::vector
或std::string
,哪知道自己的大小等,但SAL可以在C-ISH代碼與原始指針有用(如幾個Win32 API)。
關於你問題的第二部分:
「我們爲什麼需要StringCbPrintf
如果我們已經有sprintf
」
的主要原因是sprintf
是不安全和緩衝overruns-俯臥撐功能;而不是StringCbPrintf
您必須指定目標緩衝區的最大大小,這可以幫助防止緩衝區溢出(這是安全的敵人)。
添加了「windows」和「winapi」標記,因爲此問題涉及SAL註釋,這是Windows特定的。 –
請注意'_in_'和'_out_'不是有效的SAL(它們是'_In_'和'_Out_',以大寫字母開頭)。另一個有效的SAL帶有前導雙下劃線(和小寫字母首字母):'__in'和'__out'。 –