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.
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.
Odpowiedzi:
NULL
nie 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
.
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:
void f(int x);
void f(void * ptr);
f(0); // Passes int 0.
f(nullptr); // Passes void * 0.
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
lub cstddef
. Nie masz #included
odpowiedniego pliku nagłówkowego, więc g ++ widzi NULL
zwykłą nazwę zmiennej, a jej nie zadeklarowałeś.
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. (zamiast NULL
, który nie jest typem wskaźnikowym)