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.
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.
Réponses:
NULL
n'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
.
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 que NULL
.
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.
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 entre stddef.h
ou cstddef
, je crois. Vous n'avez pas de #included
fichier d'en-tête approprié, donc g ++ le considère NULL
comme 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)