it-swarm.com.de

Warum ist NULL nicht deklariert?

Ich habe ein Problem mit diesem Strukturkonstruktor, wenn ich versuche, diesen Code zu kompilieren:

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

    int data;
    Node* previous;
    Node* next;
} NODE;

wenn ich komme, tritt dieser Fehler auf:

\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 ===|

Letztes Problem war die Struktur, aber es hat gut funktioniert, als es in meiner main.cpp war. Dieses Mal ist es in einer Header-Datei und gibt mir dieses Problem. Ich benutze Code :: Blocks, um diesen Code zu kompilieren

76
TheTeh

NULL ist keine integrierte Konstante in den Sprachen C oder C++. Tatsächlich ist es in C++ mehr oder weniger veraltet, verwenden Sie einfach ein einfaches Literal 0 Stattdessen wird der Compiler je nach Kontext das Richtige tun.

Verwenden Sie in neuerem C++ (C++ 11 und höher) nullptr (wie in einem Kommentar hervorgehoben, danke).

Andernfalls fügen Sie hinzu

#include <stddef.h>

um die NULL Definition zu erhalten.

126
unwind

Verwenden Sie NULL. Es ist sowieso nur als 0 definiert und es ist sehr nützlich, es semantisch von der ganzen Zahl 0 zu unterscheiden.

Es gibt Probleme mit der Verwendung von 0 (und daher NULL). Beispielsweise:

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

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

Die nächste Version von C++ (C++ 0x) enthält nullptr, um dies zu beheben.

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

NULL ist kein nativer Bestandteil der C++ - Kernsprache, aber Teil der Standardbibliothek. Sie müssen eine der Standardheaderdateien einschließen, die die Definition enthält. #include <cstddef> oder #include <stddef.h> sollte ausreichen.

Die Definition von NULL ist garantiert verfügbar, wenn Sie cstddef oder stddef.h. Es ist nicht garantiert, aber es ist sehr wahrscheinlich, dass die Definition enthalten ist, wenn Sie stattdessen viele der anderen Standardheader einfügen.

14
CB Bailey

Enthält diese Datei "stdlib.h" oder "cstdlib"? NULL ist in stdlib.h/cstdlib definiert

#include <stdlib.h>

oder

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

Verwenden Sie nicht NULL, in C++ können Sie stattdessen den schmucklosen 0 Verwenden:

previous = 0;
next = 0;

Und wie in C++ 11 sollten Sie im Allgemeinen entweder NULLoder0 Nicht verwenden, da Sie nullptr vom Typ erhalten std::nullptr_t, Welches für die Aufgabe besser geeignet ist.

4
paxdiablo