このコードをコンパイルしようとすると、この構造体コンストラクターに問題があります。
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を使用しています
NULL
は、CまたはC++言語の組み込み定数ではありません。実際、C++では多かれ少なかれ廃止され、代わりにプレーンリテラル0
を使用するだけで、コンパイラはコンテキストに応じて正しいことを行います。
新しいC++(C++ 11以降)では、nullptr
を使用します(コメントで指摘されているように、ありがとう)。
それ以外の場合、追加
#include <stddef.h>
NULL
定義を取得します。
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*).
NULL
はコアC++言語のネイティブ部分ではありませんが、標準ライブラリの一部です。定義を含む標準ヘッダーファイルの1つを含める必要があります。 #include <cstddef>
または#include <stddef.h>
で十分です。
NULL
またはstddef.h
を含めると、cstddef
の定義が使用可能になることが保証されます。保証はされませんが、代わりに他の標準ヘッダーの多くを含めると、その定義が含まれる可能性が非常に高くなります。
このファイルに「stdlib.h」または「cstdlib」を含めていますか? NULLはstdlib.h/cstdlibで定義されています
#include <stdlib.h>
または
#include <cstdlib> // This is preferrable for c++
NULL
を使用しないでください。C++では、代わりに装飾のない0
を使用できます。
previous = 0;
next = 0;
また、C++ 11の場合と同様に、通常、NULL
or0
を使用するべきではありません。これは、タイプstd::nullptr_t
のnullptr
を提供するためです。