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.


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.


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.

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ś.


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)


0

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

#include <string.h>

String.h pobierze NULL z innego miejsca.


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 ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.