96

当我尝试编译这段代码时,我遇到了这个结构构造函数的问题:

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 来编译这段代码

4

5 回答 5

151

NULL不是 C 或 C++ 语言中的内置常量。事实上,在 C++ 中它或多或少已经过时了,只需使用普通文字0,编译器会根据上下文做正确的事情。

在较新的 C++(C++11 及更高版本)中,使用nullptr(如评论中所指出的,谢谢)。

否则,添加

#include <stddef.h>

得到NULL定义。

于 2009-05-29T06:34:20.587 回答
40

请务必使用 NULL。无论如何,它只是#defined 为 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*).
于 2009-05-29T12:52:31.477 回答
16

NULL不是核心 C++ 语言的本机部分,但它是标准库的一部分。您需要包含包含其定义的标准头文件之一。#include <cstddef>或者#include <stddef.h>应该足够了。

NULL如果包含cstddefor ,则保证 的定义可用stddef.h。不能保证,但如果您包含许多其他标准标头,您很可能会包含它的定义。

于 2009-05-29T06:34:55.407 回答
15

您是否在此文件中包含“stdlib.h”或“cstdlib”?NULL 在 stdlib.h/cstdlib 中定义

#include <stdlib.h>

或者

#include <cstdlib>  // This is preferrable for c++
于 2009-05-29T06:34:16.657 回答
4

不要使用NULL,C++ 允许你使用朴素的0代替:

previous = 0;
next = 0;

而且,与 C++11 一样,您通常不应该使用任何一个,NULL 或者 0因为它为您提供了更适合该任务nullptr的 type 。std::nullptr_t

于 2009-05-29T06:38:56.413 回答