当我尝试编译此代码时,我遇到了这个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来编译此代码
答案 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>
就足够了。
如果您加入NULL
或cstddef
,则保证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
,更适合任务。