Почему 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, который лучше подходит для задачи.