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.
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:
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é.
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)
Réponses:
NULL
n'est pas un mot-clé. C'est un identifiant défini dans certains en-têtes standard. Vous pouvez inclurePour l'avoir dans la portée, y compris d'autres bases, comme
std::size_t
.la source
nullptr
mot - clé, qui est un mot-clé réel et ne nécessite aucun#include
s. C'est aussi plus sûr de type queNULL
.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:
la source
NULL
n'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.NULL
n'est pas un mot-clé; c'est une macro substitution pour 0, et entrestddef.h
oucstddef
, je crois. Vous n'avez pas de#included
fichier d'en-tête approprié, donc g ++ le considèreNULL
comme un nom de variable normal et vous ne l'avez pas déclaré.la source
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 deNULL
, qui n'est pas un type de pointeur)la source
NULL peut également être trouvé dans:
String.h va extraire le NULL d'un autre endroit.
la source
Vous pouvez déclarer la macro NULL. Ajoutez cela après votre #includes:
ou
Non ";" à la fin des instructions ...
la source