ошибка: 'NULL' не был объявлен в этой области

98

Я получаю это сообщение при компиляции С++ на gcc 4.3

error: ‘NULL’ was not declared in this scope

Он появляется и исчезает, и я не знаю, почему. Почему?

Спасибо.

  • 2
    Возможно, вы не объявили NULL в том месте, откуда приходит сообщение?
  • 1
    Вы должны хотя бы опубликовать полный кусок кода, который дает ошибку. В противном случае будет очень сложно определить, что происходит, просто взглянув на строку ошибки.
Теги:
pointers
gcc
null

4 ответа

166
Лучший ответ

NULL не является ключевым словом. Это идентификатор, определенный в некоторых стандартных заголовках. Вы можете включить

#include <cstddef>

Чтобы иметь его в области видимости, включая некоторые другие основы, например std::size_t.

  • 0
    Боже, я настолько избалован Java (null - ключевое слово), что никогда не думал, что NULL не будет ключевым словом в c ++. Спасибо :)
  • 13
    На самом деле это не ключевое слово в Java тоже.
Показать ещё 3 комментария
32

GCC предпринимает шаги к С++ 11, поэтому, вероятно, вам нужно включить cstddef для использования константы NULL. Предпочтительным способом в С++ 11 является использование нового ключевого слова nullptr, которое реализовано в GCC с версии 4.6. nullptr неявно конвертируется в интегральные типы, поэтому его можно использовать для устранения неоднозначности вызова функции, которая была перегружена как для указателя, так и для интегральных типов:

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

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.
  • 1
    Но все же странное поведение! Даже компиляция моего кода с -std = c ++ 98 GCC по-прежнему не распознает макрос NULL и распознает только nullptr с c ++ 11 или gnu ++ 11 в качестве аргумента для -std.
  • 2
    Стандарт C ++ уже заявил в 1998 году, что NULL определен в cstddef - новые версии компилятора просто следуют стандарту более строго, потому что им нужно реализовать nullptr. Ваш (неисправный) код скомпилирован с более ранними версиями GCC, но было бы трудно поддерживать обратную совместимость с более ранними версиями GCC, в дополнение к более ранним стандартным версиям C ++.
Показать ещё 2 комментария
9

NULL не является ключевым словом; это макроподстановка для 0 и, кажется, входит в stddef.h или cstddef. У вас нет #included соответствующего заголовочного файла, поэтому g++ видит NULL в качестве обычного имени переменной, и вы еще не объявили его.

4

Чтобы выполнить другие ответы: Если вы используете С++ 11, используйте nullptr, который является ключевым словом, которое означает указатель на void, указывающий на null. (вместо NULL, который не является типом указателя)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню