Comenzaré con esto: la consistencia es el rey, la decisión es menos importante que la consistencia en su base de código.
En C ++
NULL se define como 0 o 0L en C ++.
Si ha leído El lenguaje de programación C ++, Bjarne Stroustrup sugiere usar 0
explícitamente para evitar la NULL
macro al hacer la asignación , no estoy seguro de si hizo lo mismo con las comparaciones, ha pasado un tiempo desde que leí el libro, creo que simplemente lo hizoif(some_ptr)
sin una comparación explícita pero estoy confuso en eso.
La razón de esto es que la NULL
macro es engañosa (como lo son casi todas las macros) en realidad es 0
literal, no un tipo único como su nombre lo sugiere. Evitar macros es una de las pautas generales en C ++. Por otra parte,0
parece un número entero y no lo es cuando se compara o se asigna a punteros. Personalmente, podría ir en cualquier dirección, pero por lo general omito la comparación explícita (aunque a algunas personas no les gusta esto, probablemente por eso hay un colaborador que sugiere un cambio de todos modos).
Independientemente de los sentimientos personales, esta es en gran medida una elección del menor mal, ya que no hay un método correcto.
Esto es claro y un idioma común y lo prefiero, no hay posibilidad de asignar accidentalmente un valor durante la comparación y se lee claramente:
if(some_ptr){;}
Esto está claro si sabe que some_ptr
es un tipo de puntero, pero también puede parecer una comparación de enteros:
if(some_ptr != 0){;}
Esto es claro, en casos comunes tiene sentido ... Pero es una abstracción permeable, en NULL
realidad es 0
literal y podría terminar siendo mal utilizado fácilmente:
if(some_ptr != NULL){;}
C ++ 0x tiene nullptr, que ahora es el método preferido ya que es explícito y preciso, solo tenga cuidado con la asignación accidental:
if(some_ptr != nullptr){;}
Hasta que pueda migrar a C ++ 0x, diría que es una pérdida de tiempo preocuparse por cuál de estos métodos utiliza, todos son insuficientes, razón por la cual se inventó nullptr (junto con problemas de programación genéricos que surgieron con el reenvío perfecto .) Lo más importante es mantener la consistencia.
C ª
C es una bestia diferente.
En C NULL se puede definir como 0 o como ((void *) 0), C99 permite la implementación de constantes de puntero nulo definidas. Por lo tanto, en realidad se reduce a la definición de implementación de NULL y tendrá que inspeccionarlo en su biblioteca estándar.
Las macros son muy comunes y, en general, se usan mucho para compensar las deficiencias en el soporte de programación genérica en el lenguaje y otras cosas también. El lenguaje es mucho más simple y la dependencia del preprocesador es más común.
Desde esta perspectiva, probablemente recomendaría usar la NULL
definición de macro en C.