2009-01-20 32 views
101

me sale este mensaje al compilar C++ en GCC 4,3de error: ‘NULL’ no estaba declarado en este ámbito

error: ‘NULL’ was not declared in this scope 

Aparece y desaparece y no sé qué. ¿Por qué?

Gracias.

+2

¿Quizás no ha declarado NULL en el ámbito de donde proviene el mensaje? –

+1

Al menos debe publicar la pieza completa de código que está dando el error. De lo contrario, será muy difícil saber qué está pasando con solo mirar la cadena de error. – Naveen

Respuesta

160

NULL no es una palabra clave. Es un identificador definido en algunos encabezados estándar. Puede incluir

#include <cstddef> 

tenerlo en su alcance, incluyendo algunos otros productos básicos, como std::size_t.

+0

Dios, estoy tan mimado con Java (una palabra clave nula) que nunca pensé que NULL no sería una palabra clave en C++. Gracias :) –

+13

En realidad tampoco es una palabra clave en Java. –

+4

@ManofOneWay No, existe en Java, simplemente se escribe con todas las minúsculas en lugar de mayúsculas. – Ataraxia

10

NULL no es una palabra clave; es una sustitución macro para 0, y viene en stddef.h o cstddef, creo. No tiene #included un archivo de encabezado apropiado, por lo que g ++ ve NULL como un nombre de variable regular y no lo ha declarado.

32

GCC está adoptando medidas para C++ 11, que es probablemente la razón por ahora tiene que incluir cstddef con el fin de utilizar el NULL constante. La forma preferida en C++ 11 es utilizar la nueva palabra clave nullptr, que se implementa en GCC desde la versión 4.6. nullptr no es convertir implícitamente a tipos enteros, por lo que se puede utilizar para eliminar la ambigüedad de una llamada a una función que ha sido sobrecargado por tanto puntero y tipos integrales:

void f(int x); 
void f(void * ptr); 

f(0); // Passes int 0. 
f(nullptr); // Passes void * 0. 
+1

Pero aún así es un comportamiento extraño! Incluso al compilar mi código con -std = C++ 98 las imágenes GCC no reconocen la macro NULL, y solo reconoce nullptr con C++ 11 o gnu ++ 11 como argumento para -std. – pharaoh

+2

El estándar C++ ya estableció en 1998 que NULL está definido en cstddef: las nuevas versiones de compiladores simplemente siguen el estándar más estrictamente porque necesitan implementar nullptr.Su código (defectuoso) se compiló con versiones anteriores de GCC, pero sería difícil mantenerse compatible con las versiones anteriores de GCC, además de versiones anteriores de C++ estándar. –

+0

'NULL' nunca ha sido una palabra clave incorporada; es una macro definida en varios encabezados C estándar, incluido '' (o ''). ¿Cómo afecta gcc "tomar pasos hacia C++ 11"? No veo nada en la pregunta que implique que el código (invisible) compilado con versiones anteriores de gcc/g ++, o con versiones anteriores del estándar de lenguaje. –

4

Para completar las otras respuestas: Si está usando C++ 11, use nullptr, que es una palabra clave que significa un puntero de vacío apuntando a nulo. (en lugar de NULL, que no es un tipo de puntero)

0

Puede declarar la macro NULL. Añadir que después de la suya # incluye:

#define NULL 0 

o

#ifndef NULL 
#define NULL 0 
#endif 

No ";" en el y de las instruciones.

Cuestiones relacionadas