102 votes

Pourquoi NULL n'est-il pas déclaré ?

J'ai un problème avec ce contructeur struct lorsque j'essaie 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 le struct, mais il fonctionnait bien quand il était dans mon main.cpp, cette fois-ci il est dans un fichier d'en-tête et me donne ce problème. J'utilise Code::Blocks pour compiler le code suivant

159voto

unwind Points 181987

NULL n'est pas une constante intégrée dans les langages C ou C++. En fait, en C++, c'est plus ou moins obsolète, il suffit d'utiliser un simple littéral 0 à la place, le compilateur fera la bonne chose en fonction du contexte.

Dans les versions plus récentes de C++ (C++11 et plus), utilisez nullptr (comme indiqué dans un commentaire, merci).

Sinon, ajoutez

#include <[stddef.h](http://en.wikipedia.org/wiki/Stddef.h)>

pour obtenir le NULL définition.

42voto

Utilisez NULL. Il est juste #défini comme 0 de toute façon 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égler ce problème.

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

17voto

Andy White Points 36586

Avez-vous inclus "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++

16voto

Charles Bailey Points 244082

NULL n'est pas un élément natif du langage C++ de base, mais il 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 être suffisant.

La définition de NULL est garanti si vous incluez cstddef ou stddef.h . Ce n'est pas garanti, mais vous avez de grandes chances de voir sa définition incluse si vous incluez plusieurs des autres en-têtes standard à la place.

4voto

paxdiablo Points 341644

N'utilisez pas NULL le C++ vous permet d'utiliser la version brute de la méthode 0 à la place :

previous = 0;
next = 0;

Et, comme en C++11, vous ne devriez généralement pas utiliser l'un ou l'autre des éléments suivants NULL ou 0 puisqu'il vous fournit nullptr de type std::nullptr_t qui est le mieux adapté à la tâche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X