我和一位程序員進行了一次小小的辯論。他用下面的語句在他的代碼:對`INVALID_HANDLE_VALUE`檢查`HWND`是否錯誤?
HWND hWnd = SomeFunctionWhichReturnsAWindow();
if(hWnd != NULL && hWnd != INVALID_HANDLE_VALUE)
{
// All good
}
else
{
// Error
}
我告訴他,在我看來這是一種錯誤的做法,因爲HWND
類型無關,與INVALID_HANDLE_VALUE
定義,但他肯定這是好的代碼,因爲有效的句柄永遠不可能等於INVALID_HANDLE_VALUE
,並且它處於「比安全感更安全」的情緒中。
那麼,這是一個可接受的和正確的習慣用法嗎?
錯誤是一個大詞。但是,當然,窗口句柄永遠不會有這個值,它只用於kernel32句柄。 – 2014-10-10 15:58:23
@HansPassant在實踐中,是的,但不是它只是一個實現細節? – Paul 2014-10-10 16:01:25
如果你看看返回HANDLE的各種函數,你會發現它們中的一些返回NULL(如CreateThread),其中一些返回INVALID_HANDLE_VALUE(如CreateFile)。您必須檢查文檔以查看每個特定函數在失敗時返回的內容。由於歷史原因,返回值非常不一致。這些值被選擇爲與16位Windows兼容。 16位功能的OpenFile,_lopen和_lcreat返回-1上發生故障,使32位CreateFile函數,以便於從Win16的移植代碼返回INVALID_HANDLE_VALUE。 – Marichyasana 2014-10-11 06:59:40