erreur: 'NULL' n'a pas été déclaré dans cette portée

119

Je reçois ce message lors de la compilation de C ++ sur gcc 4.3

error: NULL was not declared in this scope

Il apparaît et disparaît et je ne sais pas pourquoi. Pourquoi?

Merci.

jackhab
la source
2
Peut-être n'avez-vous pas déclaré NULL dans le champ d'où vient le message?
Paul Tomblin
1
Vous devriez au moins publier le morceau de code complet qui donne l'erreur. Sinon, il sera très difficile de dire ce qui se passe en regardant simplement la chaîne d'erreur.
Naveen

Réponses:

178

NULLn'est pas un mot-clé. C'est un identifiant défini dans certains en-têtes standard. Vous pouvez inclure

#include <cstddef>

Pour l'avoir dans la portée, y compris d'autres bases, comme std::size_t.

Johannes Schaub - litb
la source
Dieu, je suis tellement gâté avec Java (null étant un mot-clé) que je n'ai jamais pensé que NULL ne serait pas un mot-clé en c ++. Merci :)
Stefan Hendriks
14
En fait, ce n'est pas non plus un mot-clé en Java.
Man of One Way
4
@ManofOneWay Non, il existe en Java, il est simplement orthographié en minuscules au lieu de majuscules.
Ataraxia
8
@ZettaSuro Je n'ai pas dit que ça n'existait pas. Je viens de dire que ce n'est pas un mot-clé.
Man of One Way
8
Maintenant que C ++ 11 est plus généralement supporté par les compilateurs, il peut être intéressant de mentionner le nullptrmot - clé, qui est un mot-clé réel et ne nécessite aucun #includes. C'est aussi plus sûr de type que NULL.
templatetypedef
38

GCC prend des mesures vers C ++ 11, c'est probablement pourquoi vous devez maintenant inclure cstddef afin d'utiliser la constante NULL . La méthode préférée en C ++ 11 est d'utiliser le nouveau mot clé nullptr , qui est implémenté dans GCC depuis la version 4.6. nullptr n'est pas implicitement convertible en types intégraux, il peut donc être utilisé pour lever l'ambiguïté d'un appel à une fonction qui a été surchargée pour les types pointeur et intégral:

void f(int x);
void f(void * ptr);

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.
Seppo Enarvi
la source
1
Mais c'est quand même un comportement étrange! Même en compilant mon code avec -std = c ++ 98 GCC ne reconnaît toujours pas la macro NULL, et il ne reconnaît que nullptr avec c ++ 11 ou gnu ++ 11 comme argument pour -std.
pharaon
2
Le standard C ++ a déjà déclaré en 1998 que NULL est défini dans cstddef - les nouvelles versions du compilateur suivent simplement le standard plus strictement car elles doivent implémenter nullptr. Votre code (défectueux) a été compilé avec les versions antérieures de GCC, mais il serait difficile de rester rétrocompatible avec les versions antérieures de GCC, en plus des versions précédentes du standard C ++.
Seppo Enarvi
NULLn'a jamais été un mot-clé intégré; c'est une macro définie dans plusieurs en-têtes C standard, y compris <stddef.h>(ou <cstddef>). Comment gcc "prendre des mesures vers C ++ 11" affecte-t-il cela? Je ne vois rien dans la question qui implique que le code (invisible) compilé avec des versions antérieures de gcc / g ++, ou avec des versions antérieures du standard de langage.
Keith Thompson
1
C'est exactement ce que j'ai dit ci-dessus: déjà en C ++ 98, il a été défini dans cstddef. Toujours gcc (et d'autres compilateurs aussi) acceptaient le code qui utilisait NULL sans inclure d'abord cstddef. Je suis tout à fait sûr que le code (invisible) en question a été compilé avec des versions antérieures, même s'il n'est pas strictement conforme aux normes. Maintenant, je suppose que ce comportement plus strict des versions modernes est dû au développement du compilateur pour prendre en charge la syntaxe C ++ 11.
Seppo Enarvi
10

NULLn'est pas un mot-clé; c'est une macro substitution pour 0, et entre stddef.hou cstddef, je crois. Vous n'avez pas de #includedfichier d'en-tête approprié, donc g ++ le considère NULLcomme un nom de variable normal et vous ne l'avez pas déclaré.

David Thornley
la source
5

Pour compléter les autres réponses: Si vous utilisez C ++ 11, utilisez nullptr, qui est un mot-clé qui signifie un pointeur void pointant sur null. (au lieu de NULL, qui n'est pas un type de pointeur)

Léonard Raele
la source
0

NULL peut également être trouvé dans:

#include <string.h>

String.h va extraire le NULL d'un autre endroit.

Hibou
la source
0

Vous pouvez déclarer la macro NULL. Ajoutez cela après votre #includes:

#define NULL 0

ou

#ifndef NULL
#define NULL 0
#endif

Non ";" à la fin des instructions ...

Derzu
la source