web-dev-qa-db-ja.com

NULLが宣言されていないのはなぜですか?

このコードをコンパイルしようとすると、この構造体コンストラクターに問題があります。

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を使用しています

76
TheTeh

NULLは、CまたはC++言語の組み込み定数ではありません。実際、C++では多かれ少なかれ廃止され、代わりにプレーンリテラル0を使用するだけで、コンパイラはコンテキストに応じて正しいことを行います。

新しいC++(C++ 11以降)では、nullptrを使用します(コメントで指摘されているように、ありがとう)。

それ以外の場合、追加

#include <stddef.h>

NULL定義を取得します。

126
unwind

NULLを使用してください。とにかく0として#defineされており、整数0と意味的に区別するのに非常に便利です。

0(したがってNULL)の使用には問題があります。例えば:

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

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

C++の次のバージョン(C++ 0x)には、これを修正するnullptrが含まれています。

f(nullptr); // Calls f(void*).
33
Tim

NULLはコアC++言語のネイティブ部分ではありませんが、標準ライブラリの一部です。定義を含む標準ヘッダーファイルの1つを含める必要があります。 #include <cstddef>または#include <stddef.h>で十分です。

NULLまたはstddef.hを含めると、cstddefの定義が使用可能になることが保証されます。保証はされませんが、代わりに他の標準ヘッダーの多くを含めると、その定義が含まれる可能性が非常に高くなります。

14
CB Bailey

このファイルに「stdlib.h」または「cstdlib」を含めていますか? NULLはstdlib.h/cstdlibで定義されています

#include <stdlib.h>

または

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

NULLを使用しないでください。C++では、代わりに装飾のない0を使用できます。

previous = 0;
next = 0;

また、C++ 11の場合と同様に、通常、NULLor0を使用するべきではありません。これは、タイプstd::nullptr_tnullptrを提供するためです。

4
paxdiablo