web-dev-qa-db-fra.com

Pourquoi NULL est-il non déclaré?

J'ai un problème avec ce struct struct lorsque je tente de compiler ce code:

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

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

quand je viens cette erreur se produit:

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

Le dernier problème était la structure, mais cela fonctionnait bien quand il était dans mon main.cpp, cette fois-ci dans un fichier d’en-tête et me pose ce problème. J'utilise Code :: Blocks pour compiler ce code

76
TheTeh

NULL n'est pas une constante intégrée dans les langages C ou C++. En fait, en C++, il est plus ou moins obsolète, utilisez simplement un littéral simple 0 au lieu de cela, le compilateur fera le bon choix en fonction du contexte.

Dans les nouvelles versions de C++ (C++ 11 et supérieures), utilisez nullptr (comme indiqué dans un commentaire, merci).

Sinon, ajoutez

#include <stddef.h>

pour obtenir la définition de NULL.

126
unwind

Utilisez NULL. De toute façon, il est juste # défini à 0 et il est très utile de le distinguer sémantiquement de l'entier 0.

L'utilisation de 0 (et donc de NULL) pose des problèmes. Par exemple:

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

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

La prochaine version de C++ (C++ 0x) inclut nullptr pour résoudre ce problème.

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

NULL ne fait pas partie du langage C++ principal, mais fait partie de la bibliothèque standard. Vous devez inclure l'un des fichiers d'en-tête standard qui incluent sa définition. #include <cstddef> ou #include <stddef.h> devrait suffire.

La définition de NULL est assurée si vous incluez cstddef ou stddef.h. Ce n'est pas garanti, mais vous aurez très probablement sa définition incluse si vous incluez beaucoup d'autres en-têtes standard.

14
CB Bailey

Incluez-vous "stdlib.h" ou "cstdlib" dans ce fichier? NULL est défini dans stdlib.h/cstdlib

#include <stdlib.h>

ou

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

N'utilisez pas NULL, C++ vous permet d'utiliser le 0 Sans fioritures:

previous = 0;
next = 0;

Et, comme en C++ 11, vous ne devriez généralement pas utiliser NULLo0 Car il vous fournit nullptr de type std::nullptr_t, Qui convient mieux à la tâche.

4
paxdiablo