błąd: w tym zakresie nie zadeklarowano wartości „NULL”

119

Otrzymuję ten komunikat podczas kompilacji C ++ na gcc 4.3

error: NULL was not declared in this scope

Pojawia się i znika i nie wiem dlaczego. Czemu?

Dzięki.

jackhab
źródło
2
Być może nie zadeklarowałeś NULL w zakresie, z którego pochodzi wiadomość?
Paul Tomblin,
1
Powinieneś przynajmniej wysłać cały kod, który powoduje błąd. W przeciwnym razie bardzo trudno będzie stwierdzić, co się dzieje, po prostu patrząc na ciąg błędu.
Naveen

Odpowiedzi:

178

NULLnie jest słowem kluczowym. Jest to identyfikator zdefiniowany w niektórych standardowych nagłówkach. Możesz dołączyć

#include <cstddef>

Aby mieć to w zakresie, w tym kilka innych podstaw, takich jak std::size_t.

Johannes Schaub - litb
źródło
Boże, jestem tak zepsuty Javą (null to słowo kluczowe), że nigdy nie pomyślałem, że NULL nie będzie słowem kluczowym w c ++. Dzięki :)
Stefan Hendriks
14
Właściwie nie jest to również słowo kluczowe w Javie.
Man of One Way,
4
@ManofOneWay Nie, istnieje w Javie, jest zapisywany tylko małymi literami zamiast wielkich liter.
Ataraxia
8
@ZettaSuro Nie powiedziałem, że nie istnieje. Właśnie powiedziałem, że to nie jest słowo kluczowe.
Man of One Way,
8
Teraz, gdy C ++ 11 jest bardziej ogólnie obsługiwany przez kompilatory, warto wspomnieć o nullptrsłowie kluczowym, które jest rzeczywistym słowem kluczowym i nie wymaga żadnego #includes. Jest również bardziej bezpieczny niż NULL.
templatetypedef
38

GCC podejmuje kroki w kierunku C ++ 11, dlatego prawdopodobnie musisz teraz dołączyć cstddef , aby użyć stałej NULL . Preferowanym sposobem w C ++ 11 jest użycie nowego słowa kluczowego nullptr , które zostało zaimplementowane w GCC od wersji 4.6. nullptr nie jest niejawnie konwertowany na typy całkowite, więc może służyć do ujednoznaczniania wywołania funkcji, która została przeciążona zarówno dla typów wskaźnikowych, jak i całkowitych:

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

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.
Seppo Enarvi
źródło
1
Ale nadal jest to dziwne zachowanie! Nawet kompilowanie mojego kodu z -std = c ++ 98 GCC nadal nie rozpoznaje makra NULL i rozpoznaje nullptr tylko z c ++ 11 lub gnu ++ 11 jako argumentem dla -std.
faraon
2
Standard C ++ już w 1998 roku stwierdził, że NULL jest zdefiniowane w cstddef - nowe wersje kompilatora po prostu są zgodne ze standardem bardziej rygorystycznie, ponieważ muszą zaimplementować nullptr. Twój (wadliwy) kod został skompilowany z wcześniejszymi wersjami GCC, ale trudno byłoby zachować zgodność wsteczną z wcześniejszymi wersjami GCC, oprócz wcześniejszych standardowych wersji C ++.
Seppo Enarvi
NULLnigdy nie było wbudowanym słowem kluczowym; jest to makro zdefiniowane w kilku standardowych nagłówkach C, w tym <stddef.h>(lub <cstddef>). Jak gcc „podjęcie kroków w kierunku C ++ 11” wpływa na to? Nie widzę w pytaniu nic, co sugerowałoby, że (niewidoczny) kod skompilowany z wcześniejszymi wersjami gcc / g ++ lub z wcześniejszymi wersjami standardu językowego.
Keith Thompson,
1
Właśnie to powiedziałem powyżej: już w C ++ 98 było to zdefiniowane w cstddef. Wciąż gcc (i inne kompilatory także) akceptował kod używający NULL bez uprzedniego włączenia cstddef. Jestem całkiem pewien, że (niewidoczny) kod, o którym mowa, skompilowany z wcześniejszymi wersjami, mimo że nie jest ściśle zgodny ze standardami. Teraz tylko zgaduję, że to ostrzejsze zachowanie nowoczesnych wersji jest spowodowane rozwojem kompilatora do obsługi składni C ++ 11.
Seppo Enarvi
10

NULLnie jest słowem kluczowym; jest to podstawienie makra dla 0 i wydaje mi się, że pojawia się stddef.hlub cstddef. Nie masz #includedodpowiedniego pliku nagłówkowego, więc g ++ widzi NULLzwykłą nazwę zmiennej, a jej nie zadeklarowałeś.

David Thornley
źródło
5

Aby uzupełnić pozostałe odpowiedzi: Jeśli używasz C ++ 11, użyj nullptrsłowa kluczowego oznaczającego void wskaźnik wskazujący na null. (zamiast NULL, który nie jest typem wskaźnikowym)

Leonardo Raele
źródło
0

NULL można również znaleźć w:

#include <string.h>

String.h pobierze NULL z innego miejsca.

Sowa
źródło
0

Możesz zadeklarować makro NULL. Dodaj to po swoim # zawiera:

#define NULL 0

lub

#ifndef NULL
#define NULL 0
#endif

Nie ";" na końcu instrukcji ...

Derzu
źródło