2010-08-26 29 views
22

可能重複:
Do you use NULL or 0 (zero) for pointers in C++?在C++中使用NULL?

是在C++或只值0使用NULL一個好主意?

在使用C++調用C++的代碼中是否存在使用NULL的特殊情況?像SDL一樣?

+0

注意'NULL == 0'只是一個約定。 NULL可以用其他值來定義,儘管這很少見。 – 2010-08-26 17:23:30

+0

我會用另一種方式提出 - 如果你在語義上指向一個無效指針,爲什麼*不會使用NULL,這就是爲什麼? – 2010-08-26 17:23:38

+2

當然這是一個重複的問題。 – 2010-08-26 17:26:04

回答

25

在C++中NULL擴展爲0或0L。請參閱Stroustrup的評論:

我應該使用NULL還是0?在C++中,NULL的定義是 是0,所以只有 有美學差異。我更喜歡 以避免宏,所以我使用0. NULL的另一個 問題是人 有時錯誤地認爲它是 是不同於0和/或不是 整數。在預標準代碼中,NULL 有時被定義爲 不適合,因此必須避免使用 。這些日期不太常見。

如果你必須命名空指針, 稱它爲nullptr;這就是將在C++ 0x中調用的 。然後, 「nullptr」將是一個關鍵字。

+1

我想我最後一點不同意Stroustrup。我會避免在系統中使用nullptr,因爲它會在以後的實際原因中未被實現。 nullptr關鍵字的行爲不能用整數定義複製。我不認爲它可以被複制。你可能會遇到這樣的情況,你的代碼有一天會做一件事,然後是下一次,在編譯器升級之後,完全不同的東西。從本質上講,'nullptr'關鍵字旨在解決的所有問題都會改變。 – 2010-08-26 17:30:53

+1

謝謝,夥計!這真的有幫助。 #define nullptr 0會有幫助嗎? – Jookia 2010-08-26 17:31:02

+0

@Jookia:不!不要在你的代碼中使用'#define nullptr 0',閱讀上面的Noah Roberts的評論。如果你這樣做,當你升級到符合C++ 0x標準的編譯器時,你的代碼可能無法編譯(這將是一件好事),或者做一些奇怪的事情。 – Praetorian 2010-08-26 17:34:16

2

crtdbg.h(和許多其他頭):

#ifndef NULL 
#ifdef __cplusplus 
#define NULL 0 
#else 
#define NULL ((void *)0) 
#endif 
#endif 

因此NULL0,至少在Windows平臺上。所以不,我不知道。

1

我從不在我的C或C++代碼中使用NULL。 0工作得很好,就像if (ptrname)一樣。任何有能力的C或C++程序員都應該知道他們做了什麼。

+0

由於我很少使用指針(它們都在智能指針內),所以幾乎沒有什麼區別。 – 2010-08-26 18:22:34

+0

現在,C++ 11是最新的,廣泛使用的標準,我懷疑你也切換到'nullptr'。 – peterh 2016-07-15 15:01:47

+0

@peterh - 是的。這是我的一個非常早期的(6yo)職位。現在我還要指出,你還應該儘量避免完全使用指針(類似於Loki的評論,但儘量不要使用「聰明」的指針)。新的移動語義使得這更容易做到。 – 2016-07-15 15:53:53

10

C++中NULL的缺點是它是0的定義。這是一個可以靜默地轉換爲指針,bool值,float/double或int的值。

這不是非常安全的類型,並且導致我工作的應用程序出現實際的錯誤。

考慮一下:

void Foo(int i); 
void Foo(Bar* b); 
void Foo(bool b); 


main() 
{ 
    Foo(0);   
    Foo(NULL); // same as Foo(0) 
} 

C++ 11限定了nullptr即轉換爲一個空指針而不是其它標量。這在所有現代C++編譯器中都得到支持,包括2008年的VC++。在較早版本的GCC中,有一個類似的功能,但後來被稱爲__null

0

假設您沒有定義NULL的庫或系統標頭,例如(void*)0(char*)0這沒什麼問題。我總是傾向於使用0,因爲它本身就是空指針。在C++ 0x中,您將有nullptr可用,所以問題不再重要。

相關問題