2014-09-03 23 views
3

我使用C++進行編碼,並使用C函數在失敗的情況下返回NULL。將正確的想法做什麼,將其返回值與NULL或nullptr進行比較?C++:將C函數的返回值與NULL或nullptr進行比較?

if ((CreateEventEx(myEventHandleHere) == NULL) 
{ 
    ... 
} 

if ((CreateEventEx(myEventHandleHere) == nullptr) 
{ 
    ... 
} 
+0

使用nullptr - 看看在http:// EN。 wikibooks.org/wiki/More_C%2B%2B_Idioms/nullptr – 2014-09-03 17:50:23

+0

如果函數在失敗的情況下返回NULL,則應該將其返回值與NULL進行比較。 – 2014-09-03 17:52:43

+0

@DavidSchwartz:那麼'NULL'和'nullptr'在這方面的各方面完全相同,那真可惜。 – Puppy 2014-09-03 18:46:09

回答

0

我會用NULL,因爲這是C使用(也nullptr在C++中11個新的,所以如果你不使用C++ 11,那麼你必須使用NULL)。在另一方面,你可能根本就沒有檢查任何價值明確,做一個隱含的比較,而不是讓爲!= 0編譯器檢查你:

if (CreateEventEx(myEventHandleHere)) 
{ 
    ... 
} 

你應該值賦值給一個變量,所以你可以釋放它後來(如果這是什麼C API要求):

TypeName event = CreateEventEx(myEventHandleHere); 
if (event) 
{ 
    ... 
    free event when done... 
} 
-1

我不知道爲什麼它很重要,如果函數返回NULL。這是一個實現細節。有許多舊的C++函數返回NULL。許多新功能將返回nullptr。因此,如果您決定從NULL轉換爲nullptr以獲得您的自己的代碼中的空指針值,那麼無論該函數是否最初寫爲C,您都應該保持一致。當它編譯爲C++時,它成爲一個C++函數。

但是,在這種情況下,返回類型是HANDLEHANDLE實際上是void*的typedef是一個實現細節。 WinAPI文檔說當HANDLE無效時,它與NULL相當。在這種情況下,我建議你使用WinAPI文檔,並使用NULL。如果WinAPI沒有使用typedefs,並且將其所有函數記錄爲返回void*,那麼如果在其餘C++代碼中使用nullptr,那麼我將使用nullptr

2

它們完全等價,所以使用nullptr,因爲NULL是原始的C-ism,沒有理由再生活。

但是在CreateEventEx的情況下,你可以得到不是所有的無效HANDLE s都是nullptr的熱鬧獎金,其中有些是INVALID_HANDLE_VALUE。所以在HANDLE的情況下,兩者都不是「安全」的。您需要檢查CreateEventEx在失敗時返回的確切內容。

+1

讀取我在道德上同意你的觀點,但標準只能說,這是等同於爲','或者至少我找不到適用於'.h'文件的語句。充其量,似乎不明確。 – 2014-09-03 19:01:49

+1

它等同於定義。包含函數原型的文件是不相關的。 – Puppy 2014-09-04 18:19:13

5

draft C++ standard在附錄C.4C標準庫這是非標準的說:

宏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頭文件,所以雖然我們預期NULLnullptr應該是兼容空指針常量,如果他們不從,我們會感到很驚訝標準的觀點似乎至少被低估了。這給我們留下了一個兩難的困境,從實際的角度來看,我們確信它們是兼容的,但是我們沒有足夠的信息來證明它。

所以我會用NULL由特定的頭文件的定義您正在使用或者我們可以使用!= 0,因爲幸運的是這兩個C99和C++ 11告訴我們,0空指針常量

從C99部6.3.2.3指針

用值0,或這樣的表達 鑄造void *類型的整數常量表達式,被稱爲空指針constant.55)若空 指針常量被轉換爲指針類型,所產生的 指針(稱爲空指針)保證將不等於的指針與指向任何對象或函數的指針進行比較。

和:

任何指針類型可以被轉換爲整數類型。除非 先前指定,其結果是實現定義

和C++部4.10指針轉換告訴我們:

空指針常數是文字的整數(2.14.2)與值零 或std :: nullptr_t類型的值。空指針常量可以被 轉換爲指針類型;其結果是 該類型的空指針值,是從對象 指針或函數指針類型的所有其他值區分[...]

相關問題