Zacznę od tego: spójność jest królem, decyzja jest mniej ważna niż spójność w bazie kodu.
W C ++
NULL jest definiowane jako 0 lub 0L w C ++.
Jeśli przeczytałeś Język programowania C ++ Bjarne Stroustrup sugeruje użycie 0
jawnego unikania NULL
makra podczas wykonywania przypisań , nie jestem pewien, czy zrobił to samo z porównaniami, minęło trochę czasu, odkąd przeczytałem książkę, myślę, że właśnie to zrobiłif(some_ptr)
bez wyraźnego porównania, ale jestem niejasny.
Powodem tego jest to, że NULL
makro jest zwodnicze (jak prawie wszystkie makra), w rzeczywistości jest 0
dosłowne, a nie jest unikalnym typem, jak sugeruje nazwa. Unikanie makr to jedna z ogólnych wskazówek w C ++. Z drugiej strony 0
wygląda jak liczba całkowita i nie jest porównywana lub przypisywana do wskaźników. Osobiście mógłbym pójść w obie strony, ale zazwyczaj pomijam wyraźne porównanie (chociaż niektórym to się nie podoba, dlatego prawdopodobnie masz współpracownika sugerującego zmianę).
Niezależnie od osobistych odczuć jest to w dużej mierze wybór najmniejszego zła, ponieważ nie ma jednej właściwej metody.
To jest klarowny i powszechny idiom i wolę taki, nie ma szans przypadkowego przypisania wartości podczas porównania i czyta się wyraźnie:
if(some_ptr){;}
Jest to jasne, jeśli wiesz, że some_ptr
jest to typ wskaźnika, ale może również wyglądać jak porównanie liczb całkowitych:
if(some_ptr != 0){;}
Jest to jasne, w typowych przypadkach ma to sens ... Ale jest to nieszczelna abstrakcja, w NULL
rzeczywistości jest 0
dosłowna i może łatwo zostać niewłaściwie wykorzystana:
if(some_ptr != NULL){;}
C ++ 0x ma nullptr, który jest teraz preferowaną metodą, ponieważ jest wyraźny i dokładny, po prostu uważaj na przypadkowe przypisanie:
if(some_ptr != nullptr){;}
Dopóki nie będziesz w stanie przejść na C ++ 0x, uważałbym, że to strata czasu na martwienie się o to, której z tych metod używasz, wszystkie są niewystarczające, dlatego wynaleziono nullptr (razem z ogólnymi problemami programistycznymi, które doprowadziły do idealnego przekazywania .) Najważniejsze jest zachowanie spójności.
W C
C to inna bestia.
W C NULL można zdefiniować jako 0 lub jako ((void *) 0), C99 pozwala na implementację zdefiniowanych zerowych stałych wskaźnika. Tak więc sprowadza się to do definicji NULL zdefiniowanej przez implementację i będziesz musiał sprawdzić to w swojej standardowej bibliotece.
Makra są bardzo powszechne i na ogół są często używane, aby nadrobić braki w ogólnej obsłudze programowania w języku i nie tylko. Język jest znacznie prostszy i bardziej powszechne jest poleganie na preprocesorze.
Z tego punktu widzenia prawdopodobnie zalecałbym użycie NULL
definicji makra w C.