Я отримую це повідомлення при компілюванні 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
ніколи не було вбудованим ключовим словом; це макрос, визначений у кількох стандартних заголовках С, включаючи <stddef.h>
(або <cstddef>
). Як gcc "вживає заходів до C ++ 11" впливає на це? Я не бачу нічого в питанні, що означає, що (невидимий) код, складений з попередніх версій gcc / g ++, або з більш ранніми версіями мовного стандарту.
NULL
не ключове слово; це макрозаміна для 0, і він входить stddef.h
або cstddef
, я вважаю. Ви не #included
маєте відповідного файлу заголовка, тому g ++ вважається NULL
іменем звичайної змінної, і ви не оголосили його.
Для завершення інших відповідей: Якщо ви використовуєте C ++ 11, використовуйте nullptr
, що є ключовим словом, що означає недійсний покажчик, що вказує на null. (замість того NULL
, що не є типом вказівника)