C ++ işaretçileri için NULL veya 0 (sıfır) kullanıyor musunuz?


194

C ++ 'ın C üzerine cıvatalandığı ilk günlerinde NULL olarak tanımlandığı gibi kullanamazsınız (void*)0. Başka bir işaretçiye NULL atayamazsınız void*, bu da onu işe yaramaz hale getirir. O günlerde, 0boş göstericiler için (sıfır) kullandığınız kabul edildi .

Bugüne kadar sıfırı boş gösterici olarak kullanmaya devam ettim ama etrafımdakiler kullanmakta ısrar ediyorlar NULL. Ben şahsen NULLmevcut bir değere bir isim ( ) vermek için herhangi bir fayda görmüyorum - ve ben de işaretçileri doğruluk değerleri olarak test etmek istiyorum:

if (p && !q)
  do_something();

daha sonra sıfır kullanmak daha mantıklıdır (kullandığınız gibi NULL, mantıksal olarak kullanamazsınız p && !q- sıfır NULLolduğunu varsaymadıkça açıkça karşılaştırmanız gerekir NULL, bu durumda neden kullanılır NULL).

NULL yerine sıfırı tercih etmek için nesnel bir neden var mı (ya da tam tersi) mi, yoksa sadece kişisel tercih mi?

Düzenleme: RAII ve istisnalar ile nadiren sıfır / NULL işaretçileri kullandığımı eklemeliyim (ve aslında söylemek istedim), ancak bazen hala onlara ihtiyacınız var.


9
bekle, null dahili olarak sıfır olsa da olmasa da yanlış olarak değerlendirmek için bir boş gösterici gerekli değil mi?
Mooing Ördek

Yanıtlar:


186

İşte Stroustrup'un bunu ele alacağı: C ++ Stil ve Teknik SSS

C ++ 'da, tanımı NULL0'dır, bu nedenle sadece estetik bir fark vardır. Makrolardan kaçınmayı tercih ederim, bu yüzden 0 kullanıyorum. Başka bir sorun NULL, insanların yanlışlıkla yanlışlıkla 0'dan farklı olduğuna ve / veya bir tamsayı olmadığına inanmasıdır. Standart öncesi kodda, NULLbazen uygun olmayan bir şeyle tanımlanır / tanımlanır ve bu nedenle kaçınılması gerekir. Bugünlerde bu daha az yaygın.

Boş göstericiyi adlandırmanız gerekiyorsa, onu çağırın nullptr; C ++ 11'de buna denir. Ardından, nullptrbir anahtar kelime olacaktır.

Bununla birlikte, küçük şeyleri terlemeyin.


7
Bjarne, C ++ 0x yeni bir null türü üzerinde çalışmaya başlamadan önce bunu yazdı. Bir platform için kullanılabilir olduğunda NULL bu tür için kullanılacaktır ve bence bu konuda genel fikir birliğinde bir C değişikliği göreceksiniz.
Richard Corden

122

Bjarne'nin bu konudaki tutumuyla çeliştiğine inandığım birkaç argüman var (bunlardan biri nispeten yenidir).

  1. Niyetin belgelenmesi

Kullanımı NULL, kullanımında arama yapılmasına izin verir ve ayrıca , derleyici tarafından yorumlanıp yorumlanmamasına bakılmaksızın geliştiricinin bir işaretçi kullanmak istediğini vurgular .NULLNULL

  1. İşaretçi ve 'int' aşırı yüklenmesi nispeten nadirdir

Herkesin alıntıladığı örnek:

void foo(int*);
void foo (int);

void bar() {
  foo (NULL);  // Calls 'foo(int)'
}

Ancak, en azından benim düşünceme göre, yukarıdaki sorun null işaretçi sabiti için NULL kullandığımız değil, çok farklı argümanlar alan 'foo' aşırı yüklemelerimiz var. intDiğer türler belirsiz bir çağrıya neden olacağından ve yararlı bir derleyici uyarısı oluşturacağından parametre de olmalıdır .

  1. Analiz araçları BUGÜN yardımcı olabilir!

C ++ 0x yokluğunda bile, NULLişaretçiler 0için kullanıldığını ve integral türleri için kullanıldığını doğrulayan araçlar mevcuttur .

  1. C ++ 11'in yeni bir std::nullptr_ttürü olacaktır.

Bu tablodaki en yeni argüman. C ++ 0x sorunu 0ve NULLaktif olarak ele alınmaktadır ve sağlayan her uygulama için NULLilk yapacakları şey olduğunu garanti edebilirsiniz :

#define NULL  nullptr

Kullananlar için NULLziyade 0, değişim çok az veya hiç çaba ile tip-güvenliğinde bir gelişme olacak - bu da onlar kullandım birkaç hata yakalayabilir şey olursa NULLiçin 0. 0Bugün kullanan herkes için .... erm ... umarım düzenli ifadeler hakkında iyi bir bilgiye sahiptirler ...


1
Bunlar oldukça iyi noktalar, itiraf etmeliyim. C ++ 0x boş bir tür olacak sevindim, bir sürü şey daha temiz yapacak düşünüyorum.
Rob

2
@Richard, neden tam tersini yapmıyorsun? Meyers nullptr_t komutunu kullanabilirsiniz, sonra 0x kullanılabilir duruma geldiğinde #includetüm tarafını kaldırır ve güvenli tarafta kalırsınız .
fnieto - Fernando Nieto

15
#define NULL nullptrtehlikeli görünüyor. Daha iyi ya da daha kötüsü için, eski kodlar 0 dışındakiler için NULL kullanır. Örneğin, tutamaçlar genellikle bazı ayrılmaz türler olarak uygulanır ve bunları ayarlamak NULLnadir değildir. Sıfır terminatörüne a NULLayarlamak için kullanmak gibi istismarlar bile gördüm char.
Adrian McCarthy

8
@AdrianMcCarthy: Kodun sessizce derlenmesi ve farklı bir anlamı olması tehlikesi varsa tehlikeli olduğunu söyleyebilirim. Durumun bu olmadığından eminim, bu yüzden aslında NULL'in tüm yanlış kullanımları tespit edilecekti.
Richard Corden

3
@RichardCorden: Um, bu diğer kullanımların NULLaslında yanlış olduğunu varsayar . Birçok API uzun zamandır NULLtutamaçlarla kullanılmaktadır ve bu aslında birçoğu ile belgelenmiş kullanımdır. Bunları aniden kırmak ve yanlış yaptığını beyan etmek pragmatik değil.
Adrian McCarthy

45

NULL kullanın. NULL niyetinizi gösterir. Bunun 0 olması, önemli olmaması gereken bir uygulama detayıdır.


28
0 bir uygulama detayı değildir. Standart, 0'ı, bit paterni boş gösterici olarak temsil ettiği herhangi bir şekilde tanımlar.
Ferruccio

5
Sanki ..!! Dostum, C ++ düşük seviyeli bir dildir! 0 kullanın, iyi bilinen bir deyimdir.
hasen

8
Bunun standardın bir parçası olduğunu anlıyorum. Bu kod okuma kadar bir uygulama detayıdır. Okuyucu "NULL pointer" değil "0" ki bu durumda NULL pointer anlamına gelir, aritmetik yapabileceğim bir sayı değil. "
Andy Lester

2
+1. Andy ile aynı fikirde. @Ferruccio, Uygulama detay programcının fikrinin derleyici'nın uygulaması aynı değildir tanımlı
Kullanıcı

NULL kullanırsanız, karmaşık üstbilgi içermeyen düz bir kodda, "NULL bu kapsamda tanımlanmamış" hatasını bulacaksınız ..
ArtificiallyIntelligence

38

Her zaman kullanıyorum:

  • NULL işaretçiler için
  • '\0' karakterler için
  • 0.0 şamandıralar ve çiftler için

burada 0 iyi olur. Bu bir sinyal verme meselesidir. Dedi ki, ben bu konuda anal değilim.


25
örtük
yazımdan

35

NULL kullanmayı uzun süre önce (diğer makroların yanı sıra) lehine bıraktım. Bunu sadece makroları olabildiğince önlemek istemediğim için değil, aynı zamanda NULL'un C ve C ++ kodunda aşırı kullanılmış olduğu için yaptım. Sadece işaretçiler için değil, 0 değeri gerektiğinde kullanılıyor gibi görünüyor.

Yeni projelerde bunu bir proje başlığına koydum:

static const int nullptr = 0;

Şimdi, C ++ 0x uyumlu derleyiciler geldiğinde, tek yapmam gereken bu satırı kaldırmak. Bunun güzel bir yararı, Visual Studio'nun nullptr'i bir anahtar kelime olarak zaten tanıması ve uygun şekilde vurgulamasıdır.


4
NULL kullanmak daha taşınabilir uzun vadeli olacaktır. 'nullptr' bazı platformlarda kullanılabilir, bazı platformlarda kullanılamaz. Buradaki çözümünüz, yalnızca gerektiğinde mevcut olduğundan emin olmak için ön işlemciyi bildiriminizin çevresinde kullanmanızı gerektirir. NULL bunu otomatik olarak yapar.
Richard Corden

6
Katılmıyorum. Derleyiciler yetişene kadar kısa vadede daha az taşınabilir olacaktır. Uzun vadeli, aynı taşınabilir ve belki biraz daha okunabilir olacak.
Ferruccio

4
Ayrıca C ++ 0x olmayan derleyiciniz için her zaman #define nullptr NULL yapabilirsiniz.
Anteru

20
    cerr << sizeof(0) << endl;
    cerr << sizeof(NULL) << endl;
    cerr << sizeof(void*) << endl;

    ============
    On a 64-bit gcc RHEL platform you get:
    4
    8
    8
    ================

Hikayenin ahlakı. İşaretçilerle uğraşırken NULL kullanmalısınız.

1) Niyetinizi beyan eder (bir değişkenin bir işaretçi veya sayısal bir tür olup olmadığını anlamaya çalışarak tüm kodlarınızda arama yapmayın).

2) Değişken argümanları bekleyen bazı API çağrılarında, argüman listesinin sonunu belirtmek için bir NULL-pointer kullanırlar. Bu durumda, NULL yerine '0' kullanmak sorunlara neden olabilir. 64 bit platformda va_arg çağrısı 64 bit işaretçi ister, ancak yalnızca 32 bit tam sayı iletilir. Sana sıfırlanmak için diğer 32 bite güveniyormuşsun gibi geliyor mu? Çok zarif olmayan bazı derleyiciler (örneğin Intel'in icpc) gördüm - ve bu çalışma zamanı hataları ile sonuçlandı.


NULLbelki taşınabilir değildir ve güvenli değildir. Yine de platformlar olabilir #define NULL 0( Stroustrup'un SSS'sine göre : En üstteki soru tarafından belirtilen NULL veya 0?kullanmalıyım ve ilk arama sonuçları arasındadır). En azından eski C ++ 'da, 0işaretçi bağlamında özel bir kavramsal anlamı vardır. Bitler hakkında somut düşünmemelisiniz. Ayrıca farklı tamsayı bağlamlarda (unutmayın short, int, long long) " sizeof(0)" farklı olacaktır. Bence bu cevap biraz yanlış yönlendirilmiş.
FooF

(Şahsen günlük hayatta bir C programcısı olarak, insanların neden kullanmak istediğinizi anlamak için bu soruyu ziyarete geldi NULLyerine (char *)0, (const char *)0ya (struct Boo *)0ya (void *)0ya niyet daha net ifade etmek ne olursa olsun -. Çok külfetli) Bence (olmadan)
Foof

Oyvermek. msvc2013 C derleyicisinde oluyor. 64 bit, 0 bir işaretçiye dönüştürmek zaman NULL Pointer olması garanti edilmez.
pengMiao

16

Doğru hatırlıyorsam NULL kullandığım başlıklarda farklı tanımlanır. C için (void *) 0 olarak tanımlanır ve C ++ için sadece 0 olarak tanımlar. Kod şöyle görünüyordu:

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

Şahsen ben hala null işaretçileri temsil etmek için NULL değeri kullanın, bazı integral türü yerine bir işaretçi kullandığınız açıkça yapar. Evet dahili olarak NULL değeri hala 0'dır, ancak bu şekilde temsil edilmez.

Ayrıca, tamsayıların boole değerlerine otomatik dönüştürülmesine güvenmiyorum, ancak bunları açıkça karşılaştırıyorum.

Örneğin:

if (pointer_value != NULL || integer_value == 0)

ziyade:

if (pointer_value || !integer_value)

Bunların hepsinin nullptryerine basitçe kullanılabileceği C ++ 11'de düzeltildiğini NULLve aynı zamanda nullptr_ta tipi olduğunu söylemek yeterli nullptr.


15

Tarihin konuşulduğunu ve 0 (sıfır) kullanmayı savunanların yanlış olduğunu söylerdim (Bjarne Stroustrup dahil). 0 lehine olan argümanlar çoğunlukla estetik ve "kişisel tercih" idi.

C ++ 11 oluşturulduktan sonra, yeni nullptr türüyle, bazı derleyiciler 0'ı bir işaretçi olmadığı için 0'ı işaretçi bağımsız değişkenleri olan işlevlere geçirmekten şikayet ediyorlar (varsayılan parametrelerle).

Kod NULL kullanılarak yazılmış olsaydı, kod tabanından nullptr yapmak için basit bir arama ve değiştirme gerçekleştirilebilirdi. İşaretçi olarak 0 seçeneğini kullanarak yazılan bir kodla sıkışırsanız, onu güncellemek çok daha sıkıcıdır.

Ve şimdi C ++ 03 standardına yeni bir kod yazmak zorundaysanız (ve nullptr kullanamazsanız), gerçekten sadece NULL kullanmalısınız. Gelecekte güncellemenizi çok daha kolay hale getirecektir.


11

Genellikle 0 kullanırım. Makroları sevmiyorum ve kullandığınız bazı üçüncü taraf başlıklarının NULL değerini garip bir şey olarak tanımlamadığının garantisi yok.

C ++ bir nullptr anahtar kelimesi alana kadar Scott Meyers ve diğerleri tarafından önerilen şekilde bir nullptr nesnesi kullanabilirsiniz:

const // It is a const object...
class nullptr_t 
{
public:
    template<class T>
    operator T*() const // convertible to any type of null non-member pointer...
    { return 0; }

    template<class C, class T>
    operator T C::*() const   // or any type of null member pointer...
    { return 0; }

private:
    void operator&() const;  // Can't take address of nullptr

} nullptr = {};

Daha fazla bilgi için Google "nullptr".


9
NULL değerini 0 dışında herhangi bir şeye (veya (void*)0C kodu olarak derleniyorsa) tanımlayan herhangi bir üçüncü taraf kütüphanesi sadece sorun istemektedir ve kullanılmamalıdır.
Adam Rosenfield

2
Hiç NULL'ı yeniden tanımlayan bir kütüphane gördünüz mü? Hiç? Böyle bir kütüphane mevcutsa, NULL'yi yeniden tanımlamak için yeterince aptal bir kütüphane kullandığınız gibi, yeniden tanımlanmış NULL'den daha büyük sorunlarınız olur.
Andy Lester

1
On yıl kadar önce, NULL'yi tanımlayan muhtemelen Orbix veya ObjectStore gibi bazı 3. taraf başlıklarıyla uğraşmak zorunda olduğumu belirsiz bir şekilde hatırlıyorum. Birkaç gün ve gece israf ettikten sonra çeşitli üçüncü taraf başlıklarını windows.h ile çalışmaya çalıştıktan sonra patolojik bir makro nefretim olduğunu düşünüyorum.
jon-hanson

2
"Makroları sevmeyin", nesne benzeri bir # tanımın garip bir eleştirisidir. Belki de C önişlemcisini sevmediğini mi söylüyorsun?
Andrew Prock

@ Andrew - sadece parası NULLüzerinde (type *)0bana öyle geliyor, aranabilirliğine olduğunu. Aksi takdirde bir C deyim olmasaydı gereksiz bir gizleme gibi görünüyor. Ben şahsen NULLher yere yayılma deyiminin ölmeyi hak ettiğini düşünüyorum . NULLbence yararsız bir makro. Occam'ın ustura burada yapmak için biraz iş var ...
FooF

11

Bir zamanlar 0'ın geçerli bir adres olduğu ve NULL'un özel bir sekizli değer olarak tanımlandığı bir makinede çalıştım. Bu makinede (0! = NULL), yani kod gibi

char *p;

...

if (p) { ... }

beklediğiniz gibi çalışmaz. Sen yazmak zorundasın

if (p != NULL) { ... }

Her ne kadar çoğu derleyicinin NULL'u 0 olarak tanımladığına inanmama rağmen, o yıllardan önceki dersi hala hatırlıyorum: NULL mutlaka 0 değildir.


26
Uyumlu bir derleyici kullanmıyordunuz. Standart, NULL değerinin 0 olduğunu ve derleyicinin 0'ı bir işaretçi bağlamında kemer için uygun bir gerçek NULL değerine dönüştürmesi gerektiğini söylüyor .
Evan Teran

17
Evet haklısın. ANSI bir C standardı üretmeden önce 80'li yılların ortalarındaydı. O zaman uyumluluk diye bir şey yoktu ve derleyici yazarları dili uygun gördükleri gibi yorumlamakta özgürdüler. Bu yüzden bir standart gerekliydi.
mxg

9

Sanırım standart NULL == 0 garanti, bu yüzden ya da yapabilirsiniz. NULL'u tercih ediyorum çünkü niyetinizi belgeliyor.


Eğer iç içe geçmiş yapılarınız varsa, demek foo.bar_ptr = (Bar *) 0istediğimi niyetini çok daha net ifade eder foo.bar_ptr = NULL. Bu alışkanlık, derleyiciyi sizin için yanlış anlama hatalarını yakalaması için güçlendirir. Benim foo.bar_ptr = 0için niyetin yanı sıra bir işaretçi NULLolduğunu biliyorum foo.bar_ptr.
FooF

9

0 veya NULL kullanılması aynı etkiye sahip olacaktır.

Ancak bu, her ikisinin de iyi programlama uygulamaları olduğu anlamına gelmez. Performansta bir fark olmadığı göz önüne alındığında, agnostik / soyut bir alternatife göre düşük seviyeli farkında bir seçenek seçmek kötü bir programlama uygulamasıdır. Kodunuzun okuyucularının düşünce sürecinizi anlamalarına yardımcı olun .

NULL, 0, 0.0, '\ 0', 0x00 ve whatelse aynı şeyi ifade eder, ancak programınızdaki farklı mantıksal varlıklardır. Bu şekilde kullanılmaları gerekir. NULL bir işaretçi, 0 miktar, 0x0, bitleri ilginç olan bir değerdir. Derleyici olsun olmasın bir işaretçiye '\ 0' atamazsınız.

Bazı toplulukların çevrenin sözleşmelerini kırarak bir çevre hakkında derinlemesine bilgi göstermeyi teşvik ettiğini biliyorum. Bununla birlikte, sorumlu programcılar sürdürülebilir kod hazırlar ve bu tür uygulamaları kodlarının dışında tutar.


5

Garip, Stroustroup dahil hiç kimse bundan bahsetmedi. O olduğunu fark standartlar ve estetik kimse hakkında çok şey konuşurken tehlikeli kullanmaya 0içinde NULLnerede mimarisine değişken argüman listesinde, örneğin, 'in yerine sizeof(int) != sizeof(void*). Stroustroup gibi, 0estetik nedenlerden dolayı tercih ederim , ancak biri türünün belirsiz olabileceği yerlerde kullanmamaya dikkat etmeliyim .


Ve bu tehlikeli yerlerde hala kullanabilirsiniz 0hangi belirtmek sağlanan 0Şunu - örneğin (int *)0, (char *)0, (const char *)0veya (void *)0veya (unsigned long long) 0veya her neyse. Bence bu niyetin çok daha net olduğunu ifade ediyor NULL.
FooF

1
Tabii, ne anlama geldiğini bilmiyorsanız NULL.
Michael Krelin - hacker

Ben şahsen ben tam türü kullanmak zaman gereksiz yere bir şey döküm biraz tatsız buluyorum (void *). İşaretçi kasasına benzer olduğu için listede (tipik olarak) 64 bit tamsayı örneğini verdim. Eski C ++ tanımlanan bu benim hatırlama Dahası, NULLolarak 0doğrudur, o zaman programın doğruluğu hiçbir iyileşme şahit (ben C ++ programlanmış beri yıldır). Yeni C ++ standardı neyse ki nullptranahtar kelime sağlar, böylece daha NULLyeni C ++ yazarken bu çirkinlik ve tüm tartışmalardan kurtulabiliriz .
FooF

İşte bu yüzden döküm yapmak (void*)soyutlandı NULL. Ve NULLaslında niyeti çoğu zaman açıkça ifade eder. Bence hatırlamanın yanlış. Standartlar hakkında emin değilim, ama pratikte olduğuna inanıyorum (void*)0. Ve nullptrevet, aynı NULLşey anlamına gelse de, hoş bir güzeldir - türü belirtmeden boş gösterici belirtmek.
Michael Krelin - hacker

1
@FooF, bazı platformlarda - belki. Gerçekliğimde işe yaradı ve bu yüzden bir işaretçi olarak tanımlandığından şüpheleniyorum. Sağlamlığa gelince, evet, söylemeye çalıştığım şey nullptr, aynı mesajı taşıyor NULL, bu sadece başlangıçta bahsettiğiniz amacı ifade etmekle ilgiliydi. ( Her ne olursa olsun NULL, modern gccverimler üzerinde önişleme __null).
Michael Krelin - hacker

4

Mümkünse C ++ referanslarını kullanarak tüm soruyu önlemek için deneyin. Ziyade

void foo(const Bar* pBar) { ... }

sık sık yazabilirsiniz

void foo(const Bar& bar) { ... }

Tabii ki, bu her zaman işe yaramaz; ancak boş göstergeler aşırı kullanılabilir.


3

Ben bu konuda Stroustrup ile :-) :-) NULL dilin bir parçası olmadığından, 0 kullanmayı tercih ederim.


3

Çoğunlukla kişisel tercih, ancak NULL'un nesnenin şu anda hiçbir şeye işaret etmediği bir işaretçi olduğunu açıkça ortaya koyabileceği argümanı olabilir;

void *ptr = &something;
/* lots o' code */
ptr = NULL; // more obvious that it's a pointer and not being used

IIRC'de, standart NULL değerinin 0 olmasını gerektirmez, bu nedenle <stddef.h> dosyasında tanımlanan her şeyi kullanmak derleyiciniz için muhtemelen en iyisidir.

Argümanın bir başka yönü de mantıksal karşılaştırmalar (boole örtülü olarak döküm) veya NULL'a karşı açıklık kontrolü kullanmanız gerekip gerekmediğidir, ancak bu da okunabilirliğe iner.


3

NULL değerinin aritmetik bir değeri değil, bir işaretçi temsil olduğu açıktır gibi NULL kullanmayı tercih ederim. Bunun bir makro olması talihsiz, ama çok köklü bir şekilde yerleştiği için çok az tehlike var (birisi gerçekten baş dönmüş bir şey yapmadığı sürece). Keşke en başından beri bir anahtar kelime olsaydı, ama ne yapabilirsin?

Bununla birlikte, işaretçileri kendi içlerinde doğruluk değerleri olarak kullanma konusunda sorunum yok. Tıpkı NULL'da olduğu gibi, bu yerleşik bir deyimdir.

C ++ 09, gecikmiş olduğunu düşündüğüm nullptr yapısını ekleyecektir.


1

Ben her zaman 0 kullanıyorum. Sadece C ++ öğrenmeye başladığımda 0 ile tavsiye edilen bir şeyi okuduğumdan ve her zaman bu şekilde yaptığımdan dolayı, gerçek düşünülmüş bir sebep için değil. Teoride okunabilirlikte bir karışıklık sorunu olabilir, ancak pratikte bir zamanlar binlerce adam-saat ve milyonlarca kod satırında böyle bir konuyla hiç karşılaşmadım. Stroustrup'un dediği gibi, standart nullptr olana kadar gerçekten kişisel bir estetik sorun.


1

Birisi bana bir kez söyledi ... NULL değerini 69 olarak yeniden tanımlayacağım. O zamandan beri kullanmıyorum: P

Kodunuzu oldukça savunmasız hale getirir.

Düzenle:

Standarttaki her şey mükemmel değildir. NULL makro, C NULL makro ile tam olarak uyumlu olmayan, uygulama tanımlı bir C ++ null işaretçi sabiti olup, örtük türün gizlenmesinin yanı sıra işe yaramaz ve hatalara eğilimli bir araçta onu dönüştürür.

NULL, boş gösterici olarak değil, O / OL değişmezi olarak davranır.

Bir sonraki örneğin kafa karıştırıcı olmadığını söyle:

void foo(char *); 
void foo(int); 
foo(NULL); // calls int version instead of pointer version! 

Tüm bunlardan dolayı, yeni standartta std :: nullptr_t görünür

Yeni standardı beklemek istemiyorsanız ve bir nullptr kullanmak istiyorsanız, Meyers tarafından önerilen gibi en azından iyi bir standart kullanın (bkz. Jon.h yorumu).


5
NULLC ++ standardının iyi tanımlanmış bir parçasıdır. Projenizde standart makro düzenleme kodunu yeniden tanımlamak isteyen kişilerin kodunuzu 'savunmasız' hale getirmesine izin vermek; kullanma NULLyapmaz.
CB Bailey

1

Mümkün olduğunca 0 veya NULL işaretçileri kullanmadığımı iddia ediyorum.

Bunları er ya da geç kullanmak, kodunuzda segmentasyon hatalarına yol açacaktır. Benim tecrübelerime göre, bu ve gereral işaretçiler C ++ hataların en büyük kaynaklarından biridir

ayrıca, kodunuzun her yerinde "if-not-null" ifadelerine yol açar. Her zaman geçerli bir duruma güvenebilirseniz çok daha güzel.

Neredeyse her zaman daha iyi bir alternatif vardır.


2
Bir garantili segmentasyon hatası (ve bir sen KQUEUE zaman çağdaş sistemlerde garanti 0) 'dir yararlı ayıklama için. Rastgele çöpleri silmek ve kimin ne sonucunu bildiklerinden çok daha iyi.
Orbit'te Hafiflik Yarışları

-4

İşaretçiyi 0 olarak ayarlamak o kadar açık değildir. Özellikle C ++ dışında bir dil gelirseniz. Buna C ve Javascript de dahildir.

Son zamanlarda böyle bazı kod ile delt:

virtual void DrawTo(BITMAP *buffer) =0;

ilk kez saf sanal işlev için. Bir hafta boyunca sihirli bir jiberjash olduğunu düşündüm. Ben sadece temel fonksiyon işaretçisi bir null(sanal fonksiyonlar C ++ için çoğu durumda sadece fonksiyon işaretçiler olduğu gibi) ayarlamak olduğunu fark kendimi tekmeledim.

virtual void DrawTo(BITMAP *buffer) =null;

yeni gözlerime uygun boşluk bırakmadan bu yıkımdan daha az kafa karıştırıcı olurdu. Aslında, neden C ++ küçük nullharf yanlış ve doğru kullanıyor gibi merak etmiyorum merak ediyorum .


Genel olarak işaretçiler için NULl değerini 0 olarak tercih ederim. Ancak '= 0;' C ++ 'da saf bir sanal işlev bildirmenin deyimsel yoludur. '= NULL;' kullanmamanızı şiddetle tavsiye ediyorum. bu özel durum için.
danio

Bu StackOverflow'un en komik yorumu. Muhtemelen şimdi verdiğiniz örneğin bir işaretçi değil, saf sanal işlev için bir sözdizimi olduğunu zaten biliyorsunuzdur. Ve evet @danio haklı, saf sanal işlev için NULL kullanmamalısınız.
sgowd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.