96

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

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 を使用してこのコードをコンパイルしています

4

5 に答える 5

151

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

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

それ以外の場合は追加

#include <stddef.h>

定義を取得しNULLます。

于 2009-05-29T06:34:20.587 に答える
40

NULL を使用してください。とにかく 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*).
于 2009-05-29T12:52:31.477 に答える
16

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

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

于 2009-05-29T06:34:55.407 に答える
15

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

#include <stdlib.h>

また

#include <cstdlib>  // This is preferrable for c++
于 2009-05-29T06:34:16.657 に答える
4

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

previous = 0;
next = 0;

また、C++11 の場合と同様に、通常はNULL or を使用しないでください。これは、このタスクにより適したof type が0提供されるためです。nullptrstd::nullptr_t

于 2009-05-29T06:38:56.413 に答える