Inizierò con questo: la coerenza è il re, la decisione è meno importante della coerenza nella tua base di codice.
In C ++
NULL è definito come 0 o 0L in C ++.
Se hai letto Il linguaggio di programmazione C ++ Bjarne Stroustrup suggerisce di usare 0esplicitamente per evitare la NULLmacro durante l'assegnazione , non sono sicuro che abbia fatto lo stesso con i confronti, è passato un po 'di tempo da quando ho letto il libro, penso che abbia appena fatto if(some_ptr)senza un confronto esplicito, ma sono confuso su questo.
La ragione di ciò è che la NULLmacro è ingannevole (come quasi tutte le macro) in realtà è 0letterale, non un tipo unico come suggerisce il nome. Evitare le macro è una delle linee guida generali in C ++. D'altra parte, 0sembra un numero intero e non lo è se confrontato o assegnato ai puntatori. Personalmente potrei andare in entrambi i modi, ma in genere ignoro il confronto esplicito (anche se ad alcune persone questo non piace, questo è probabilmente il motivo per cui hai un collaboratore che suggerisce comunque un cambiamento).
Indipendentemente dai sentimenti personali, questa è in gran parte una scelta del minimo male in quanto non esiste un metodo giusto.
Questo è chiaro e un linguaggio comune e lo preferisco, non c'è possibilità di assegnare accidentalmente un valore durante il confronto e si legge chiaramente:
if(some_ptr){;}
Questo è chiaro se sai che some_ptrè un tipo di puntatore, ma può anche apparire come un confronto intero:
if(some_ptr != 0){;}
Questo è chiaro, nei casi comuni ha senso ... Ma è un'astrazione che perde, NULLè in realtà 0letterale e potrebbe finire per essere abusato facilmente:
if(some_ptr != NULL){;}
C ++ 0x ha nullptr che ora è il metodo preferito in quanto è esplicito e preciso, basta fare attenzione all'assegnazione accidentale:
if(some_ptr != nullptr){;}
Fino a quando non sarai in grado di migrare a C ++ 0x, direi che è una perdita di tempo preoccuparsi di quale di questi metodi usi, sono tutti insufficienti ed è per questo che è stato inventato nullptr (insieme a problemi di programmazione generici che sono emersi con un perfetto inoltro .) La cosa più importante è mantenere la coerenza.
In C.
C è una bestia diversa.
In C NULL può essere definito come 0 o come ((void *) 0), C99 consente costanti puntatore null definite dall'implementazione. Quindi, in realtà, si riduce alla definizione di NULL dell'implementazione e dovrai ispezionarla nella tua libreria standard.
Le macro sono molto comuni e in generale vengono utilizzate molto per compensare le carenze nel supporto della programmazione generica nel linguaggio e in altre cose. Il linguaggio è molto più semplice e la dipendenza dal pre-processore è più comune.
Da questa prospettiva probabilmente consiglierei di usare la NULLdefinizione macro in C.