2010-08-26 14 views
22

Duplicar posible:
Do you use NULL or 0 (zero) for pointers in C++?Usando NULL en C++?

¿Es una buena idea usar NULL en C++ o simplemente el valor 0?

¿Hay alguna circunstancia especial que use NULL en las llamadas al código C desde C++? Al igual que SDL?

+0

tenga en cuenta que 'NULL == 0' es solo una convención. NULL se puede definir con algún otro valor, aunque sería un caso raro. –

+0

Me gustaría plantear esto al revés: si te estás refiriendo semánticamente a un puntero no válido, ¿por qué * no usarías * NULL, que es exactamente eso? –

+2

Seguramente esta es una pregunta duplicada. –

Respuesta

25

En C++ NULL se expande a 0 o 0L. Ver este comentario de Stroustrup:

Debo usar NULL o 0? En C++, la definición de NULL es 0, por lo que hay solo una diferencia estética. Prefiero para evitar macros, entonces uso 0. Otro problema de con NULL es que las personas a veces creen erróneamente que es diferente de 0 y/o no es entero. En el código preestablecido, NULL se definía a veces como algo inadecuado y por lo tanto tenía/debe ser evitado. Eso es menos común estos días.

Si tiene que nombrar el puntero nulo, llámelo nullptr; eso es lo que se llamará en C++ 0x. Entonces, "nullptr" será una palabra clave.

+1

Creo que tengo que estar en desacuerdo con Stroustrup en el último momento. Evitaría el uso de nullptr en sistemas en los que aún no está implementado por el mismo motivo que lo hará más tarde. El comportamiento de la palabra clave nullptr no se puede replicar con una definición integral. No creo que pueda ser replicado en absoluto. Podría encontrarse con situaciones en las que su código hace una cosa un día y luego la siguiente, después de una actualización del compilador, algo totalmente diferente. Básicamente, todo lo que la palabra clave 'nullptr' pretende abordar cambiará. –

+1

¡Gracias, amigo! Esto realmente ayudó. ¿Podría #define nullptr 0 ser de alguna ayuda? – Jookia

+0

@Jookia: ¡No! No use '#define nullptr 0' en su código, lea el comentario anterior de Noah Roberts. Si haces eso, cuando actualices a un compilador compatible con C++ 0x, es posible que tu código no se compile (lo que sería bueno) o que hagas cosas raras. – Praetorian

2

De crtdbg.h (y muchas otras cabeceras):

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

Por lo tanto NULL es 0, al menos en la plataforma Windows. Entonces no, no es que yo sepa.

1

Nunca uso NULL en mi código C o C++. 0 funciona bien, al igual que if (ptrname). Cualquier programador C o C++ competente debería saber lo que hacen.

+0

Dado que casi nunca uso punteros (están todos dentro de punteros inteligentes), no hace mucha diferencia. –

+0

Ahora que C++ 11 es el estándar más reciente y ampliamente utilizado, sospecho que también cambió a 'nullptr'. – peterh

+0

@peterh - Sí. Este fue un post muy temprano (6yo) mío. En estos días también me apresuraría a señalar que también debería esforzarse por evitar el uso de punteros por completo (similar al comentario de Loki, pero trate de no necesitar siquiera los "inteligentes"). La nueva semántica de movimientos hace que esto sea mucho más fácil de hacer. –

10

La desventaja de NULL en C++ es que es una definición para 0. Este es un valor que puede convertirse silenciosamente en puntero, un valor bool, un flotante/doble o un int.

Eso no es muy seguro y ha dado lugar a errores reales en una aplicación en la que trabajé.

Considera:

void Foo(int i); 
void Foo(Bar* b); 
void Foo(bool b); 


main() 
{ 
    Foo(0);   
    Foo(NULL); // same as Foo(0) 
} 

C++ 11 define un nullptr que es convertible en un puntero nulo pero no a otros escalares. Esto es compatible con todos los compiladores modernos de C++, incluido VC++ a partir de 2008. En las versiones anteriores de GCC hay una característica similar, pero luego se llamaba __null.

0

Suponiendo que no tiene una biblioteca o encabezado de sistema que defina NULL como por ejemplo (void*)0 o (char*)0, está bien. Siempre tiendo a usar 0, ya que es, por definición, el puntero nulo. En C++ 0x, tendrá nullptr disponible, por lo que la pregunta ya no tendrá tanta importancia.