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:
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ś.
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)
Odpowiedzi:
NULL
nie jest słowem kluczowym. Jest to identyfikator zdefiniowany w niektórych standardowych nagłówkach. Możesz dołączyćAby mieć to w zakresie, w tym kilka innych podstaw, takich jak
std::size_t
.źródło
nullptr
słowie kluczowym, które jest rzeczywistym słowem kluczowym i nie wymaga żadnego#include
s. Jest również bardziej bezpieczny niżNULL
.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:
źródło
NULL
nigdy 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.NULL
nie jest słowem kluczowym; jest to podstawienie makra dla 0 i wydaje mi się, że pojawia sięstddef.h
lubcstddef
. Nie masz#included
odpowiedniego pliku nagłówkowego, więc g ++ widziNULL
zwykłą nazwę zmiennej, a jej nie zadeklarowałeś.źródło
Aby uzupełnić pozostałe odpowiedzi: Jeśli używasz C ++ 11, użyj
nullptr
słowa kluczowego oznaczającego void wskaźnik wskazujący na null. (zamiastNULL
, który nie jest typem wskaźnikowym)źródło
NULL można również znaleźć w:
String.h pobierze NULL z innego miejsca.
źródło
Możesz zadeklarować makro NULL. Dodaj to po swoim # zawiera:
lub
Nie ";" na końcu instrukcji ...
źródło