Помилка: "NULL" не було оголошено в цій області


119

Я отримую це повідомлення при компілюванні C ++ на gcc 4.3

error: NULL was not declared in this scope

Він з’являється і зникає, і я не знаю чому. Чому?

Дякую.


2
Можливо, ви не оголосили NULL у межах, звідки надходить повідомлення?
Пол Томблін

1
Ви повинні принаймні опублікувати повний фрагмент коду, який видає помилку. Інакше буде дуже важко сказати, що відбувається, просто переглянувши рядок помилок.
Naveen

Відповіді:


178

NULLне є ключовим словом. Це ідентифікатор, визначений у деяких стандартних заголовках. Ви можете включити

#include <cstddef>

Мати його в обсязі, включаючи деякі інші основи, наприклад std::size_t.


Боже, я настільки зіпсований Java (нульове ключове слово), що ніколи не думав, що NULL не буде ключовим словом у c ++. Дякую :)
Стефан Хендрікс

14
Насправді це не ключове слово і в Java.
Людина в один бік

4
@ManofOneWay Ні, він існує на Java, це просто написано з усіх малих літер замість великих літер.
Атараксія

8
@ZettaSuro Я не сказав, що його не існує. Я щойно сказав, що це не ключове слово.
Людина в один бік

8
Тепер, коли C ++ 11 більше підтримується компіляторами, можливо, варто згадати nullptrключове слово, яке є фактичним ключовим словом і не вимагає #includes. Це також більш безпечно, ніж тип NULL.
templatetypedef

38

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.

1
Але все ж Це дивна поведінка! Навіть компілюючи мій код із -std = c ++ 98, GCC все ще не розпізнає макрос NULL, і він розпізнає лише nullptr з c ++ 11 або gnu ++ 11 як аргумент для -std.
фараон

2
Стандарт C ++ вже в 1998 році заявив, що NULL визначений у cstddef - нові версії компілятора просто суворіше відповідають стандарту, оскільки їм потрібно реалізувати nullptr. Ваш (несправний) код складено з більш ранніми версіями GCC, однак було б важко залишатися назад сумісними з більш ранніми версіями GCC, крім попередніх стандартних версій C ++.
Seppo Enarvi

NULLніколи не було вбудованим ключовим словом; це макрос, визначений у кількох стандартних заголовках С, включаючи <stddef.h>(або <cstddef>). Як gcc "вживає заходів до C ++ 11" впливає на це? Я не бачу нічого в питанні, що означає, що (невидимий) код, складений з попередніх версій gcc / g ++, або з більш ранніми версіями мовного стандарту.
Кіт Томпсон

1
Це саме те, про що я говорив вище: Вже в C ++ 98 це було визначено в cstddef. Ще gcc (і інші компілятори теж) прийняли код, який використовував NULL, не включаючи cstddef спочатку. Я впевнений, що також (невидимий) код, про який йдеться, складений з попередніх версій, хоча він суворо не відповідає стандартам. Зараз я лише здогадуюсь, що ця суворіша поведінка сучасних версій обумовлена ​​розробкою компілятора для підтримки синтаксису C ++ 11.
Seppo Enarvi

10

NULLне ключове слово; це макрозаміна для 0, і він входить stddef.hабо cstddef, я вважаю. Ви не #includedмаєте відповідного файлу заголовка, тому g ++ вважається NULLіменем звичайної змінної, і ви не оголосили його.


5

Для завершення інших відповідей: Якщо ви використовуєте C ++ 11, використовуйте nullptr, що є ключовим словом, що означає недійсний покажчик, що вказує на null. (замість того NULL, що не є типом вказівника)


0

NULL також можна знайти в:

#include <string.h>

String.h потягне NULL з іншого місця.


0

Ви можете оголосити макрос NULL. Додайте це після своїх #includes:

#define NULL 0

або

#ifndef NULL
#define NULL 0
#endif

Немає ";" наприкінці інструкцій ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.