Bununla başlayacağım: tutarlılık kraldır, karar kod tabanınızdaki tutarlılıktan daha az önemlidir.
C ++ dilinde
NULL, C ++ 'da 0 veya 0L olarak tanımlanır.
C ++ Programlama Dili'ni okuduysanız Bjarne Stroustrup, atama yaparken makrodan 0
kaçınmak için açıkça kullanmanızı önerirNULL
, karşılaştırmalarıyla aynı şeyi yapıp yapmadığından emin değilim, kitabı okuduğumdan beri bir süre geçti, sanırım sadece yaptı if(some_ptr)
açık bir karşılaştırma olmadan ama ben bu konuda bulanık.
Bunun nedeni, NULL
makronun aldatıcı olması (neredeyse tüm makrolar gibi) aslında 0
gerçek anlamlıdır, adından da anlaşılacağı gibi benzersiz bir tür değildir. Makrolardan kaçınmak, C ++ 'daki genel yönergelerden biridir. Öte yandan, 0
bir tamsayı gibi görünür ve işaretçilerle karşılaştırıldığında ya da atanmış değildir. Şahsen ben her iki şekilde de gidebilirim, ama tipik olarak açık karşılaştırmayı atlıyorum (bazı insanlar bunu sevmiyor olsa da, muhtemelen neden bir değişiklik öneren bir katkıda bulunuyorsunuz).
Kişisel duygular ne olursa olsun, doğru bir yöntem olmadığı için bu büyük ölçüde en az kötülük seçeneğidir.
Bu açık ve ortak bir deyim ve bunu tercih ediyorum, karşılaştırma sırasında yanlışlıkla bir değer atama şansı yok ve açıkça okuyor:
if(some_ptr){;}
Bu some_ptr
bir işaretçi türü olduğunu biliyorsanız açıktır , ancak tamsayı karşılaştırması gibi de görünebilir:
if(some_ptr != 0){;}
Bu açıktır, yaygın durumlarda mantıklıdır ... Ama sızdıran bir soyutlama, NULL
aslında 0
gerçek anlamlıdır ve kolayca kötüye kullanılabilir:
if(some_ptr != NULL){;}
C ++ 0x şimdi açık ve doğru olduğu için tercih edilen yöntem olan nullptr'e sahiptir, sadece yanlışlıkla atama konusunda dikkatli olun:
if(some_ptr != nullptr){;}
C ++ 0x'e geçiş yapabilene kadar, bu yöntemlerden hangisini kullandığınız konusunda endişelenmenin zaman kaybı olduğunu iddia edeceğim, hepsi yetersizdir, bu yüzden nullptr icat edilmiştir (mükemmel yönlendirme ile ortaya çıkan genel programlama sorunları ile birlikte) .) En önemli şey tutarlılığı sağlamaktır.
C cinsinden
C farklı bir yaratıktır.
C NULL değerinde 0 veya ((void *) 0) olarak tanımlanabilir, C99, tanımlanmış null işaretçi sabitlerinin uygulanmasına izin verir. Yani aslında uygulamanın NULL tanımına gelir ve bunu standart kütüphanenizde incelemeniz gerekir.
Makrolar çok yaygındır ve genel olarak, dilde ve diğer şeylerde genel programlama desteğindeki eksiklikleri telafi etmek için çok kullanılırlar. Dil çok daha basittir ve ön işlemciye güvenmek daha yaygındır.
Bu açıdan muhtemelen NULL
C'deki makro tanımını kullanmanızı tavsiye ederim .