为什么NULL未声明?

时间:2009-05-29 06:30:20

标签: c++ syntax nodes

当我尝试编译此代码时,我遇到了这个struct contructor的问题:

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 个答案:

答案 0 :(得分:121)

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

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

否则,添加

#include <stddef.h>

获取NULL定义。

答案 1 :(得分:33)

请使用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*).

答案 2 :(得分:14)

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

如果您加入NULLcstddef,则保证stddef.h的定义可用。它不能保证,但如果你包含许多其他标准标题,你很可能会得到它的定义。

答案 3 :(得分:9)

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

中定义
#include <stdlib.h>

#include <cstdlib>  // This is preferrable for c++

答案 4 :(得分:4)

不要使用NULL,C ++允许您使用简单的0代替:

previous = 0;
next = 0;

而且,与在C ++ 11中一样,您通常不应该使用NULL 0,因为它为您提供nullptr类型std::nullptr_t,更适合任务。