Я получаю это сообщение при компиляции C ++ на gcc 4.3
error: ‘NULL’ was not declared in this scope
Он появляется и исчезает, и я не знаю почему. Зачем?
Спасибо.
Я получаю это сообщение при компиляции C ++ на gcc 4.3
error: ‘NULL’ was not declared in this scope
Он появляется и исчезает, и я не знаю почему. Зачем?
Спасибо.
Ответы:
NULL
не ключевое слово. Это идентификатор, определенный в некоторых стандартных заголовках. Вы можете включить
#include <cstddef>
Чтобы он был в объеме, включая некоторые другие основы, например std::size_t
.
nullptr
ключевое слово, которое на самом деле является ключевым словом и не требует #include
s. Это также более безопасно, чем NULL
.
GCC делает шаги в направлении C ++ 11, вероятно, поэтому теперь вам нужно включить cstddef , чтобы использовать константу NULL . В C ++ 11 предпочтительнее использовать новое ключевое слово nullptr , которое реализовано в GCC начиная с версии 4.6. nullptr не может быть неявно преобразован в целочисленные типы, поэтому его можно использовать для устранения неоднозначности вызова функции, которая была перегружена как для указателей, так и для целочисленных типов:
void f(int x);
void f(void * ptr);
f(0); // Passes int 0.
f(nullptr); // Passes void * 0.
NULL
никогда не было встроенным ключевым словом; это макрос, определенный в нескольких стандартных заголовках C, включая <stddef.h>
(или <cstddef>
). Как gcc "предпринимает шаги к C ++ 11" влияет на это? Я не вижу в вопросе ничего, что подразумевает, что (невидимый) код скомпилирован с более ранними версиями gcc / g ++ или более ранними версиями языкового стандарта.
NULL
не ключевое слово; это макро-подстановка для 0, и , я полагаю , входит stddef.h
или cstddef
. У вас нет #included
подходящего файла заголовка, поэтому g ++ воспринимает его NULL
как обычное имя переменной, а вы его не объявили.
Чтобы завершить другие ответы: если вы используете C ++ 11, используйте nullptr
, которое является ключевым словом, которое означает указатель void, указывающий на null. (вместо NULL
, который не является типом указателя)