2009-01-20 7 views
101

dostaję ten komunikat podczas kompilowania C++ na gcc 4.3błąd: „NULL” nie został zadeklarowany w tym zakresie

error: ‘NULL’ was not declared in this scope 

To pojawia się i znika i nie wiem dlaczego. Czemu?

Dzięki.

+2

Być może nie zadeklarowałeś NULL w zakresie, skąd wiadomość pochodzi? –

+1

Powinieneś co najmniej napisać kompletny fragment kodu, który podaje błąd. W przeciwnym razie bardzo trudno będzie określić, co się dzieje, patrząc na ciąg znaków błędu. – Naveen

Odpowiedz

160

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

#include <cstddef> 

mieć go w zasięgu, w tym niektórych innych podstaw, jak std::size_t.

+0

Boże, jestem tak rozpieszczona Javą (null jest słowem kluczowym), że nigdy nie myślałem, że NULL nie będzie słowem kluczowym w C++. Dzięki :) –

+13

Właściwie to nie jest też słowo kluczowe w Javie. –

+4

@ManofOneWay Nie, istnieje w Javie, jest po prostu pisane wielkimi literami zamiast wielkich liter. – Ataraxia

10

NULL nie jest słowem kluczowym; jest to podstawienie makra dla 0, i jest w stddef.h lub cstddef, jak sądzę. Nie masz odpowiedniego pliku nagłówkowego, więc g ++ widzi NULL jako zwykłą nazwę zmiennej i nie zadeklarowałeś tego.

32

GCC jest podjęcie kroków w kierunku C++ 11, który pewnie dlatego teraz trzeba to cstddef w celu wykorzystania NULL stała. Preferowanym sposobem w C++ 11 jest użycie nowego słowa kluczowego "nullptr ", które jest implementowane w GCC od wersji 4.6. nullptr nie jest niejawnie zamienny do integralnych typów, dzięki czemu może być używany do dwuznaczności wywołanie funkcji, która została przeciążona zarówno wskaźnik i integralnych typach:

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

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

Ale nadal To dziwne zachowanie! Nawet kompilowanie mojego kodu za pomocą -std = C++ 98 obrazów GCC nie rozpoznaje makr NULL i rozpoznaje tylko nullptr z C++ 11 lub gnu ++ 11 jako argumentem dla -std. – pharaoh

+2

Standard C++ stwierdził już w 1998 r., Że NULL jest zdefiniowany w cstddef - nowe wersje kompilatorów po prostu stosują się do normy w bardziej ścisły sposób, ponieważ muszą implementować 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++. –

+0

'NULL' nigdy nie było wbudowanym słowem kluczowym; jest to makro zdefiniowane w kilku standardowych nagłówkach C, w tym '' (lub ''). Jak wpływa na to gcc "podejmowanie kroków w kierunku C++ 11"? Nic nie widzę w pytaniu, które sugeruje, że (niewidoczny) kod skompilowany z wcześniejszymi wersjami gcc/g ++ lub z wcześniejszymi wersjami standardu językowego. –

4

aby dokończyć inne odpowiedzi: Jeśli jesteś używając C++ 11, użyj nullptr, co jest słowem kluczowym, które oznacza pustą wskazówkę wskazującą na wartość null. (zamiast NULL, który nie jest typem wskaźnika)

0

Możesz zadeklarować makro NULL. Dodać, że po wyrazami dyrektywami #INCLUDE:

#define NULL 0 

lub

#ifndef NULL 
#define NULL 0 
#endif 

No ";" na i instrukcje.