我使用C++進行編碼,並使用C函數在失敗的情況下返回NULL。將正確的想法做什麼,將其返回值與NULL或nullptr進行比較?C++:將C函數的返回值與NULL或nullptr進行比較?
if ((CreateEventEx(myEventHandleHere) == NULL)
{
...
}
或
if ((CreateEventEx(myEventHandleHere) == nullptr)
{
...
}
我使用C++進行編碼,並使用C函數在失敗的情況下返回NULL。將正確的想法做什麼,將其返回值與NULL或nullptr進行比較?C++:將C函數的返回值與NULL或nullptr進行比較?
if ((CreateEventEx(myEventHandleHere) == NULL)
{
...
}
或
if ((CreateEventEx(myEventHandleHere) == nullptr)
{
...
}
我會用NULL
,因爲這是C使用(也nullptr
在C++中11個新的,所以如果你不使用C++ 11,那麼你必須使用NULL
)。在另一方面,你可能根本就沒有檢查任何價值明確,做一個隱含的比較,而不是讓爲!= 0
編譯器檢查你:
if (CreateEventEx(myEventHandleHere))
{
...
}
你應該值賦值給一個變量,所以你可以釋放它後來(如果這是什麼C API要求):
TypeName event = CreateEventEx(myEventHandleHere);
if (event)
{
...
free event when done...
}
我不知道爲什麼它很重要,如果函數返回NULL。這是一個實現細節。有許多舊的C++函數返回NULL。許多新功能將返回nullptr
。因此,如果您決定從NULL
轉換爲nullptr
以獲得您的自己的代碼中的空指針值,那麼無論該函數是否最初寫爲C,您都應該保持一致。當它編譯爲C++時,它成爲一個C++函數。
但是,在這種情況下,返回類型是HANDLE
。 HANDLE
實際上是void*
的typedef是一個實現細節。 WinAPI文檔說當HANDLE
無效時,它與NULL
相當。在這種情況下,我建議你使用WinAPI文檔,並使用NULL
。如果WinAPI沒有使用typedefs,並且將其所有函數記錄爲返回void*
,那麼如果在其餘C++代碼中使用nullptr
,那麼我將使用nullptr
。
它們完全等價,所以使用nullptr
,因爲NULL
是原始的C-ism,沒有理由再生活。
但是在CreateEventEx的情況下,你可以得到不是所有的無效HANDLE
s都是nullptr
的熱鬧獎金,其中有些是INVALID_HANDLE_VALUE
。所以在HANDLE
的情況下,兩者都不是「安全」的。您需要檢查CreateEventEx在失敗時返回的確切內容。
讀取我在道德上同意你的觀點,但標準只能說,這是等同於爲'
它等同於定義。包含函數原型的文件是不相關的。 – Puppy 2014-09-04 18:19:13
的draft C++ standard在附錄C.4
C標準庫這是非標準的說:
宏NULL,在任何<clocale>,<cstddef>的定義,<cstdio>, <cstdlib>,<cstring>,<ctime>或<cwchar>,is一個 實現定義的C++空指針常量在此國際 標準(18.2)中。
相應規範部分同意例如18.2
說:
宏NULL是一個實現定義的C++空指針常量 在本國際標準(4.10)0.194
這就意味着如果你使用的是那些特定的頭文件,NULL
應該與nullptr
兼容,然後我只用nullptr
。
附錄D
覆蓋兼容性似乎並沒有做出類似的語句.h
頭文件,所以雖然我們預期NULL
和nullptr
應該是兼容空指針常量,如果他們不從,我們會感到很驚訝標準的觀點似乎至少被低估了。這給我們留下了一個兩難的困境,從實際的角度來看,我們確信它們是兼容的,但是我們沒有足夠的信息來證明它。
所以我會用NULL
由特定的頭文件的定義您正在使用或者我們可以使用!= 0
,因爲幸運的是這兩個C99和C++ 11告訴我們,0
是空指針常量。
從C99部6.3.2.3
指針:
用值0,或這樣的表達 鑄造void *類型的整數常量表達式,被稱爲空指針constant.55)若空 指針常量被轉換爲指針類型,所產生的 指針(稱爲空指針)保證將不等於的指針與指向任何對象或函數的指針進行比較。
和:
任何指針類型可以被轉換爲整數類型。除非 先前指定,其結果是實現定義
和C++部4.10
指針轉換告訴我們:
空指針常數是文字的整數(2.14.2)與值零 或std :: nullptr_t類型的值。空指針常量可以被 轉換爲指針類型;其結果是 該類型的空指針值,是從對象 指針或函數指針類型的所有其他值區分[...]
使用nullptr - 看看在http:// EN。 wikibooks.org/wiki/More_C%2B%2B_Idioms/nullptr – 2014-09-03 17:50:23
如果函數在失敗的情況下返回NULL,則應該將其返回值與NULL進行比較。 – 2014-09-03 17:52:43
@DavidSchwartz:那麼'NULL'和'nullptr'在這方面的各方面完全相同,那真可惜。 – Puppy 2014-09-03 18:46:09