¿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.
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:
¡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.
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)
Respuestas:
NULL
no es una palabra clave. Es un identificador definido en algunos encabezados estándar. Puedes incluirPara tenerlo en alcance, incluidos algunos otros conceptos básicos, como
std::size_t
.fuente
nullptr
palabra clave, que es una palabra clave real y no requiere ninguna#include
s. También es más seguro para tipos queNULL
.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:
fuente
NULL
nunca 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.NULL
no es una palabra clave; es una macro sustitución de 0, y entrastddef.h
ocstddef
, creo. No tiene#included
un archivo de encabezado apropiado, por lo que g ++ lo veNULL
como un nombre de variable regular y no lo ha declarado.fuente
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 deNULL
, que no es un tipo de puntero)fuente
NULL también se puede encontrar en:
String.h extraerá el NULL de otro lugar.
fuente
Puede declarar la macro NULL. Agregue eso después de su #includes:
o
No ";" al final de las instrucciones ...
fuente