簡體   English   中英

C ++:將C函數的返回值與NULL或nullptr進行比較?

[英]C++: Compare return value of C function to NULL or nullptr?

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

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

要么

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

附錄C.4 C標准庫中的 C ++標准草案非規范性說:

在任何<clocale>,<cstddef>,<cstdio>,<cstdlib>,<cstring>,<ctime>或<cwchar>中定義的宏NULL是本國際標准中實現定義的C ++空指針常量(18.2)。

相應的規范部分同意例如18.2說:

宏NULL是本國際標准(4.10)中實現定義的C ++空指針常量.194

這意味着如果你使用那些特定的頭, NULL應該與nullptr兼容,然后我會使用nullptr

在附錄D ,涵蓋兼容性似乎沒有為.h頭文件做出類似的聲明,所以盡管我們希望NULLnullptr應該是兼容的空指針常量 ,如果它們不是從標准的角度來看我們會感到驚訝它似乎至少是不明確的。 這使我們陷入兩難境地,從實際角度來看,我們非常確定它們是兼容的,但我們沒有足夠的信息來證明它。

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

從C99部分6.3.2.3 指針

值為0的整型常量表達式或類型為void *的表達式稱為空指針常量.55)如果將空指針常量轉換為指針類型,則生成的指針(稱為空指針)為保證比較不等於指向任何對象或函數的指針。

和:

任何指針類型都可以轉換為整數類型。 除了之前指定的以外,結果是實現定義的

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

空指針常量是值為零的整數文字(2.14.2)或類型為std :: nullptr_t的prvalue。 空指針常量可以轉換為指針類型; 結果是該類型的空指針值,並且可以與對象指針或函數指針類型的每個其他值區分開來。[...]

它們完全相同,所以使用nullptr因為NULL是一個原始的C-ism,沒有理由再活下去了。

但是在CreateEventEx的情況下,你有一個非常好的獎勵,即並非所有無效的HANDLE都是nullptr ,而是其中一些是INVALID_HANDLE_VALUE 所以在HANDLE的情況下,兩者都不是真的“安全”。 您需要確切地檢查CreateEventEx在失敗時返回的內容。

我會使用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沒有使用typedef,並且只是將其所有函數記錄為返回void* ,那么我將使用nullptr ,如果你在其余的C ++代碼中使用nullptr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM