error: 'NULL' no se declaró en este ámbito

119

Recibo este mensaje al compilar C ++ en gcc 4.3

error: NULL was not declared in this scope

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

Gracias.

Jackhab
fuente
2
¿Quizás no ha declarado NULL en el ámbito de donde proviene el mensaje?
Paul Tomblin
1
Debería al menos publicar el código completo que está dando el error. De lo contrario, será muy difícil saber qué está sucediendo con solo mirar la cadena de error.
Naveen

Respuestas:

178

NULLno es una palabra clave. Es un identificador definido en algunos encabezados estándar. Puedes incluir

#include <cstddef>

Para tenerlo en alcance, incluidos algunos otros conceptos básicos, como std::size_t.

Johannes Schaub - litb
fuente
Dios, estoy tan mimado con Java (siendo nulo una palabra clave) que nunca pensé que NULL no sería una palabra clave en c ++. Gracias :)
Stefan Hendriks
14
En realidad, tampoco es una palabra clave en Java.
Man of One Way
4
@ManofOneWay No, existe en Java, simplemente se escribe con minúsculas en lugar de mayúsculas.
Ataraxia
8
@ZettaSuro No dije que no existiera. Solo dije que no es una palabra clave.
Man of One Way
8
Ahora que C ++ 11 es compatible de forma más general con los compiladores, podría valer la pena mencionar la nullptrpalabra clave, que es una palabra clave real y no requiere ninguna #includes. También es más seguro para tipos que NULL.
templatetypedef
38

GCC está dando pasos hacia C ++ 11, que probablemente sea la razón por la que ahora necesita incluir cstddef para usar la constante NULL . La forma preferida en C ++ 11 es usar la nueva palabra clave nullptr , que se implementa en GCC desde la versión 4.6. nullptr no se puede convertir implícitamente en tipos integrales, por lo que se puede usar para eliminar la ambigüedad de una llamada a una función que se ha sobrecargado tanto para los tipos de puntero como para los integrales:

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

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.
Seppo Enarvi
fuente
1
¡Pero aún así es un comportamiento extraño! Incluso compilando mi código con -std = c ++ 98, las imágenes fijas de GCC no reconocen la macro NULL, y solo reconocen nullptr con c ++ 11 o gnu ++ 11 como argumento para -std.
faraón
2
El estándar C ++ ya declaró en 1998 que NULL está definido en cstddef; las nuevas versiones del compilador simplemente siguen el estándar de manera más estricta porque necesitan implementar nullptr. Su código (defectuoso) se ha compilado con versiones anteriores de GCC, pero sería difícil mantener la compatibilidad con versiones anteriores de GCC, además de las versiones estándar de C ++ anteriores.
Seppo Enarvi
NULLnunca ha sido una palabra clave incorporada; es una macro definida en varios encabezados C estándar, incluidos <stddef.h>(o <cstddef>). ¿Cómo afecta esto gcc "dar pasos hacia C ++ 11"? No veo nada en la pregunta que implique que el código (no visto) compilado con versiones anteriores de gcc / g ++, o con versiones anteriores del estándar de lenguaje.
Keith Thompson
1
Eso es exactamente lo que dije anteriormente: ya en C ++ 98 estaba definido en cstddef. Aún así, gcc (y otros compiladores también) aceptaron código que usaba NULL sin incluir primero cstddef. Estoy bastante seguro de que también el código (no visto) en cuestión se compiló con versiones anteriores, aunque no es estrictamente compatible con el estándar. Ahora solo supongo que este comportamiento más estricto de las versiones modernas se debe al desarrollo del compilador para admitir la sintaxis de C ++ 11.
Seppo Enarvi
10

NULLno es una palabra clave; es una macro sustitución de 0, y entra stddef.ho cstddef, creo. No tiene #includedun archivo de encabezado apropiado, por lo que g ++ lo ve NULLcomo un nombre de variable regular y no lo ha declarado.

David Thornley
fuente
5

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

Leonardo Raele
fuente
0

NULL también se puede encontrar en:

#include <string.h>

String.h extraerá el NULL de otro lugar.

Búho
fuente
0

Puede declarar la macro NULL. Agregue eso después de su #includes:

#define NULL 0

o

#ifndef NULL
#define NULL 0
#endif

No ";" al final de las instrucciones ...

Derzu
fuente