errore: "NULL" non è stato dichiarato in questo ambito


119

Ricevo questo messaggio durante la compilazione di C ++ su gcc 4.3

error: NULL was not declared in this scope

Appare e scompare e non so perché. Perché?

Grazie.


2
Forse non hai dichiarato NULL nell'ambito della provenienza del messaggio?
Paul Tomblin,

1
Dovresti almeno pubblicare il pezzo di codice completo che sta dando l'errore. Altrimenti sarà molto difficile capire cosa sta succedendo semplicemente guardando la stringa di errore.
Naveen

Risposte:


178

NULLnon è una parola chiave. È un identificatore definito in alcune intestazioni standard. Puoi includere

#include <cstddef>

Per averlo nel campo di applicazione, comprese alcune altre basi, come std::size_t.


Dio, sono così viziato con Java (null è una parola chiave) che non avrei mai pensato che NULL non sarebbe stata una parola chiave in c ++. Grazie :)
Stefan Hendriks

14
In realtà non è nemmeno una parola chiave in Java.
Man of One Way

4
@ManofOneWay No, esiste in Java, è solo scritto con tutte le lettere minuscole invece che maiuscole.
Ataraxia

8
@ZettaSuro non ho detto che non esiste. Ho appena detto che non è una parola chiave.
Man of One Way

8
Ora che C ++ 11 è più generalmente supportato dai compilatori, potrebbe valere la pena menzionare la nullptrparola chiave, che è una parola chiave effettiva e non richiede alcun #includes. È anche più typesafe di NULL.
templatetypedef

38

GCC sta facendo passi verso C ++ 11, motivo per cui ora è necessario includere cstddef per utilizzare la costante NULL . Il modo preferito in C ++ 11 è usare la nuova parola chiave nullptr , implementata in GCC dalla versione 4.6. nullptr non è convertibile implicitamente in tipi integrali, quindi può essere utilizzato per disambiguare una chiamata a una funzione che è stata sovraccaricata sia per i tipi puntatore che per quelli integrali:

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

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

1
Ma è ancora un comportamento strano! Anche compilando il mio codice con -std = c ++ 98 GCC ancora non riconosce la macro NULL e riconosce solo nullptr con c ++ 11 o gnu ++ 11 come argomento per -std.
faraone

2
Lo standard C ++ ha affermato già nel 1998 che NULL è definito in cstddef - le nuove versioni del compilatore seguono semplicemente lo standard in modo più rigoroso perché devono implementare nullptr. Il codice (difettoso) è stato compilato con le versioni precedenti di GCC, ma sarebbe difficile rimanere compatibili con le versioni precedenti di GCC, oltre alle precedenti versioni standard di C ++.
Seppo Enarvi

NULLnon è mai stata una parola chiave incorporata; è una macro definita in diverse intestazioni C standard, tra cui <stddef.h>(o <cstddef>). In che modo gcc "intraprende passi verso C ++ 11" influisce su questo? Non vedo nulla nella domanda che implichi che il codice (invisibile) sia stato compilato con versioni precedenti di gcc / g ++ o con versioni precedenti dello standard del linguaggio.
Keith Thompson,

1
Questo è proprio quello che ho detto sopra: già in C ++ 98 era definito in cstddef. Tuttavia gcc (e anche altri compilatori) accettava codice che utilizzava NULL senza includere prima cstddef. Sono abbastanza sicuro che anche il codice (invisibile) in questione sia stato compilato con versioni precedenti, anche se non è strettamente conforme agli standard. Ora sto solo immaginando che questo comportamento più rigoroso delle versioni moderne sia dovuto allo sviluppo del compilatore per supportare la sintassi C ++ 11.
Seppo Enarvi

10

NULLnon è una parola chiave; è una sostituzione macro per 0, e arriva stddef.ho cstddef, credo. Non hai #includedun file di intestazione appropriato, quindi g ++ vede NULLcome un nome di variabile regolare e non l'hai dichiarato.


5

Per completare le altre risposte: Se stai usando C ++ 11, usa nullptr, che è una parola chiave che significa un puntatore void che punta a null. (invece di NULL, che non è un tipo di puntatore)


0

NULL può essere trovato anche in:

#include <string.h>

String.h inserirà il NULL da qualche altra parte.


0

Puoi dichiarare la macro NULL. Aggiungilo dopo il tuo #includes:

#define NULL 0

o

#ifndef NULL
#define NULL 0
#endif

No ";" alla fine delle istruzioni ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.