Почему NULL необъявлен?
У меня проблема с этим конструктором структуры, когда я пытаюсь скомпилировать этот код:
typedef struct Node
{
Node( int data ) //
{
this->data = data;
previous = NULL; // Compiler indicates here
next = NULL;
}
int data;
Node* previous;
Node* next;
} NODE;
когда я нахожу эту ошибку:
\linkedlist\linkedlist.h||In constructor `Node::Node(int)':|
\linkedlist\linkedlist.h|9|error: `NULL' was not declared in this scope|
||=== Build finished: 1 errors, 0 warnings ===|
Последней проблемой была структура, но она отлично работала, когда она была в моем main.cpp, на этот раз она в файле заголовка и дает мне эту проблему. Я использую Code:: Blocks для компиляции этого кода
Ответы
Ответ 1
NULL
не является встроенной константой на языках C или С++. На самом деле, в С++ он более или менее устарел, просто используйте простой литерал 0
, а компилятор будет делать правильные вещи в зависимости от контекста.
В новом С++ (С++ 11 и выше) используйте nullptr
(как указано в комментарии, спасибо).
В противном случае добавьте
#include <stddef.h>
чтобы получить определение NULL
.
Ответ 2
Использовать NULL. Это просто #defined как 0 в любом случае, и очень полезно семантически отличить его от целого числа 0.
Есть проблемы с использованием 0 (и, следовательно, NULL). Например:
void f(int);
void f(void*);
f(0); // Ambiguous. Calls f(int).
Следующая версия С++ (С++ 0x) включает nullptr
, чтобы исправить это.
f(nullptr); // Calls f(void*).
Ответ 3
NULL
не является родной частью основного языка С++, но является частью стандартной библиотеки. Вам нужно включить один из стандартных файлов заголовков, которые включают его определение. #include <cstddef>
или #include <stddef.h>
должно быть достаточно.
Определение NULL
гарантируется, если вы включите cstddef
или stddef.h
. Это не гарантировано, но вы, скорее всего, включите его определение, если вместо этого вы включите многие другие стандартные заголовки.
Ответ 4
Вы включаете в этот файл "stdlib.h" или "cstdlib"? NULL определяется в stdlib.h/cstdlib
#include <stdlib.h>
или
#include <cstdlib> // This is preferrable for c++
Ответ 5
Не используйте NULL
, С++ позволяет вместо этого использовать неприкрашенный 0
:
previous = 0;
next = 0;
И, как и в С++ 11, вы обычно не должны использовать NULL
или 0
, поскольку он предоставляет вам nullptr
типа std::nullptr_t
, который лучше подходит для задачи.