Почему NULL не объявлен? - PullRequest
73 голосов
/ 29 мая 2009

У меня проблема с этим конструктором структуры, когда я пытаюсь скомпилировать этот код:

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 для компиляции этого кода

Ответы [ 5 ]

122 голосов
/ 29 мая 2009

NULL не является встроенной константой в языках C или C ++. Фактически, в C ++ он более или менее устарел, просто используйте простой литерал 0, вместо этого компилятор будет делать правильные вещи в зависимости от контекста.

В более новой версии C ++ (C ++ 11 и выше) используйте nullptr (как указано в комментарии, спасибо).

В противном случае добавить

#include <<a href="http://en.wikipedia.org/wiki/Stddef.h" rel="noreferrer">stddef.h</a>>

чтобы получить определение NULL.

33 голосов
/ 29 мая 2009

Используйте NULL. В любом случае он просто # 0 определен как 0, и очень полезно семантически отличить его от целого числа 0.

Есть проблемы с использованием 0 (и, следовательно, NULL). Например:

void f(int);
void f(void*);

f(0); // Ambiguous. Calls f(int).

Следующая версия C ++ (C ++ 0x) включает nullptr, чтобы исправить это.

f(nullptr); // Calls f(void*).
14 голосов
/ 29 мая 2009

NULL не является родной частью основного языка C ++, но является частью стандартной библиотеки. Вам необходимо включить один из стандартных заголовочных файлов, которые включают его определение. #include <cstddef> или #include <stddef.h> должно быть достаточно.

Определение NULL гарантированно будет доступно, если вы включите cstddef или stddef.h. Это не гарантируется, но вы, скорее всего, включите его определение, если вместо этого включите многие другие стандартные заголовки.

9 голосов
/ 29 мая 2009

Включаете ли вы в этот файл "stdlib.h" или "cstdlib"? NULL определяется в stdlib.h / cstdlib

#include <stdlib.h>

или

#include <cstdlib>  // This is preferrable for c++
4 голосов
/ 29 мая 2009

Не используйте NULL, C ++ позволяет использовать вместо этого 0:

previous = 0;
next = 0;

И, как и в C ++ 11, вы, как правило, не должны использовать NULL или 0, поскольку он предоставляет вам nullptr типа std::nullptr_t, что лучше подходит для задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...