[résolu][C++] NULL not define in this scope

alors voila : j’ai un code C++ qui est censé fonctionné, de 4 lignes, et j’ai cette erreur à la compilation…
Comment c’est possible, un “NULL not define in this scope”, en C++.

Je sais pertinemment que je peux (dois) utiliser 0 (zéro) au lieu de NULL, mais je voudrais bien comprendre quand même.
Précision : en remplaçant NULL par 0(zéro), ca compile sans problème…

compilo : G++ 4.1.2 20060928 (prerelease) (ubuntu 4.1.1-13ubuntu 5) fourni avec ma ubuntu (ubuntu 4.1.1-13ubuntu 5)

je précise qu’il n’y a rien du style #undef NULL dans mon code…

Des idées ?
Solution : l’initilaisation de NULL est dans <stdlib.h> merci, Drealmer et JDaM

Il te manque probablement un #include ?

Il me semble qu’en C++ il faut utiliser null et non NULL.
Et normalement, je ne pense pas que ce soit une question d’include.

On peut voir ton code au cas ou?

‘null’ n’existe pas en C++ !! on est ni en Java ni en C# hein B)
NULL fait effectivement parti de la plupart des header C. Si jme rappelle bien la guideline pour tester les pointeurs est if (!pointeur) {} pour tester la valeur, donc ni 0 ni NULL.

Bah en fait j’ai pas inclus le code parce qu’il est particulièrement “spécial”.
compte tenu du fait qu’il s’agit d’une appli anciennement en C dans laquelle je mets une structure basée sur des classes et des héritages, il y a beaucoup de chose assez affreuses d’un point de vue objet… Donc j’ose pas trop mettre tout ca…

le corps de la fonction incriminée est celui-ci :

[code]type_arbre* creer_appelfonc(int num_id) {
//type_arbre tmp=(type_arbre)malloc(sizeof(type_arbre));
type_appelfonc *tmp = new type_appelfonc();
tmp->type=A_APPEL_FONC;

tmp->expression=creer_expr(A_APPELFONC,’ ', NULL, NULL, NULL, num_id);

//return (type_arbre *)tmp;
return tmp;
}[/code]

en sachant que type_appelfonc dérive de type_arbre…

La prochaine étape est de renomer ces creer_“quelque chose” en constructeurs paramétrés pour chacune de mes classes… mais je préfère avancer par petits pas…

L’étape actuelle c’est de diviser mes fichiers qui contenaient les déclarations de 10 structures/classes moches en 20 fichiers contenant chacun la déclaration/définition d’une structure/classe moche… et cette étape, qui était censé être la plus simple, est celle qui me pose le fameux problème du NULL non défini… bien entendu, j’ai continué avec des 0 (zéro) à la place des NULL, mais c’est quand même bizarre, comme truc… Surtout quand on sait qu’il y a des NULL dans d’autres fichiers et que ceux-là compilent parfaitement…

molyss > pour ce genre de galère avec les header, passe un coup de doxygen en lui demandant de génerer tout plein de graph dans tous les sens, comme ça il peut te creer un graph d’inclusion des .h et tu trouveras surement d’où vient exactement le problème. Je me rappelle plus les options a activé, mais si tu es intéressé je doit avoir un fichier de conf qui fait ça dans un coin.

Contrairement à ce que l’on croit le NULL ne fait pas partie du langage C ou du C++.
Exemple :

jdam@pingouin-routard:/tmp$ cat > a.c void main(int argc,char** argv) { int* p = NULL; return; } jdam@pingouin-routard:/tmp$ gcc a.c a.c: In function 'main': a.c:3: error: 'NULL' undeclared (first use in this function) a.c:3: error: (Each undeclared identifier is reported only once a.c:3: error: for each function it appears in.) a.c:2: warning: return type of 'main' is not 'int'

En effet NULL est déclaré dans les headers de la stdlib.
Le meilleur moyen d’avoir accès au NULL est d’inclure <stdlib.h>.

Plus particulièrement sous linux on peut le trouver dans stddef.h :

[code]jdam@pingouin-routard:/tmp$ head /usr/include/linux/stddef.h
#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif[/code]

Le fait est que, sous de nombreux IDE tels que visual studio, des fichiers .h sont inclus d’office afin de rendre la vie plus simple à l’utilisateur (ce qui n’est pas toujours vrai d’ailleurs…B)) et parmis ces déclarations il doit y avoir un #define NULL ((void*)0) de planqué quelque part. Voilà.

Effectivement NULL ne fait pas partie du langage C++, ni même du C. Cependant, ça fait partie des librairies C standard, mais pas dans celles du C++. En effet, un pointeur nul en C++ c’est simplement 0 et pas ((void*)0). Un tel cast explicite est une aberration en C++, 0 a un statut spécial en tant que pointeur, qui est parfaitement intégré au langage.

Si tu tiens malgré tout à utiliser NULL, il faut inclure par exemple <stdio.h> ou <stddef.h>, c’est défini un peu partout.

bon, bah sujet marqué en résolu, et solution remontée dans le message initial (on sait jamais, ca peut toujours servir).
Merci donc JDaM et Drealmer, il suffisait d’inclure stdlib.h

Tiens d’ailleurs je savais pas que le 0 en tant que pointeur avait un statut spécial en cpp…
(D’ailleurs si on me filait 1€ à chaque fois que j’apprend un nouveau truc en cpp
, et ce malgrès le fait que ça fait 6 ans que j’en fais, je serais largement à l’abri du besoin B) )

Malgrès tout ça reste bien pratique le NULL pour marquer une différence entre les bricolages
sur les pointeurs et le reste des calculs, ça coute rien et ça aide (enfin moi ça m’aide) à la
lecture du code.

[quote]Malgrès tout ça reste bien pratique le NULL pour marquer une différence entre les bricolages
sur les pointeurs et le reste des calculs, ça coute rien et ça aide (enfin moi ça m’aide) à la
lecture du code.[/quote]

Tout a fait d’accord que c’est pratique de savoir tout de suite s’il s’agit d’un pointeur ou d’un zero numerique. Une convention personnelle qui m’a ete enseignee par mon mentor C++ il y deja bien des annees, et qui evite de se taper un include: au lieu d’utiliser NULL, j’ecris 00 (zero exprime en octal pour etre exact). Avec cette convention, plus de doute.