为什么NULL未声明?

79 c++ syntax nodes

我尝试编译此代码时遇到此结构构造函数的问题:

typedef struct Node
{
    Node( int data ) //
    {
        this->data = data;
        previous = NULL; // Compiler indicates here
        next = NULL;
    }

    int data;
    Node* previous;
    Node* next;
} NODE;
Run Code Online (Sandbox Code Playgroud)

当我来这个错误发生时:

\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 ===|
Run Code Online (Sandbox Code Playgroud)

最后一个问题是结构,但它在我的main.cpp中运行正常,这次是在头文件中并且给我这个问题.我正在使用Code :: Blocks来编译此代码

unw*_*ind 128

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

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

否则,添加

#include <stddef.h>

得到NULL定义.

  • 当你的意思是"空"时,不要使用"0"!有一个_difference_:语义.永远不要低估知道什么是什么以及使用正确的词的重要性,即使编译器会让你逃脱它! (26认同)
  • @ 6502不是在谈论那个; 0和NULL确实具有相同的值(几乎),因此使用'\ 0'或0将意外地工作.问题是语义.使用NULL更具表现力,因为它表示值是一个指针,而不仅仅是一个整数. (13认同)
  • `<cstddef>`是更清洁的选择. (8认同)
  • NULL在以下C头中定义:stddef.h,stdlib.h,stdio.h,locale.h,string.h和time.h(如果计算C99,则为wchar.h). (7认同)
  • NULL是stddef.h的一部分,而不是stdlib.h.从技术上讲,你不能保证将它作为stdlib.h的一部分得到它,虽然我承认如果你没有这样做会非常令人惊讶. (6认同)
  • @Charles Bailey C++ 明确提到 cstddef,因为它将 NULL 定义为 0 而不是 C99 中的 ((void *)0) 。这是因为在 C++ 中禁止从 void * 进行隐式转换。 (2认同)
  • 哦,在即将到来的C++ 0x中会有一个新的关键字null_ptr.见http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2105.html (2认同)
  • 我知道为什么标准需要讨论NULL的类型,我只是想知道为什么它只提到它在C标准库中定义的地方.目前,新的关键字C++ 0x仍然拼写为'nullptr'. (2认同)
  • NULL,虽然返回C可能优于'0',但如果没有其他原因,当C++ 0x到达null_ptr时,将更容易进行搜索并替换为NULL! (2认同)
  • @IanMallett:如果你在谈论空指针不能保证由二进制零组成的事实你就错了.指针上下文中的"0"是空指针,即使这可能意味着它不是二进制零.你甚至可以使用ASCII NUL char(一个L)`'\ 0'`作为空指针.实际上,为了增加对伤害的侮辱,你可以使用零指针的任何积分**常量表达式**(不仅仅是文字),包括"3-2-1"或"!!!!! 1".显然Stroustrup认为这一切都很有趣(参见TCPPPL段落). (2认同)
  • 这在C++ 0中是不正确的,'\ 0'只会偶然发挥作用.根据C++标准,它总是有效的. (2认同)

小智 33

请使用NULL.无论如何它只是#defined为0,从语义上将它与整数0区分开来非常有用.

使用0(因此为NULL)存在问题.例如:

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

f(0); // Ambiguous. Calls f(int).
Run Code Online (Sandbox Code Playgroud)

下一版本的C++(C++ 0x)包括nullptr解决这个问题.

f(nullptr); // Calls f(void*).
Run Code Online (Sandbox Code Playgroud)

  • 它被大多数C标准库实现定义为`((void*)0)`. (3认同)
  • 这是我读过的关于以下主题的最佳**简短**答案(并且技术上精确):NULL vs. 0 vs. nullptr。谢谢你! (3认同)
  • @SiPlus `((void *)0)` 在 C++ 中是不正确的,因为 `void*` 不能像在 C 中那样强制转换为其他指针类型。例如,glibc 在 `__cplusplus 时执行 `#define NULL 0` ` 已定义。 (2认同)

CB *_*ley 14

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

NULL如果您包含cstddef或,则保证定义可用stddef.h.它不能保证,但如果你包含许多其他标准头文件,你很可能会得到它的定义.


And*_*ite 9

你在这个文件中包含"stdlib.h"或"cstdlib"吗?NULL在stdlib.h/cstdlib中定义

#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)

要么

#include <cstdlib>  // This is preferrable for c++
Run Code Online (Sandbox Code Playgroud)

  • NULL 是 stddef.h 的一部分,而不是 stdlib.h (2认同)