2009-01-20 6 views
101

Je reçois ce message lors de la compilation C++ sur gcc 4,3erreur: « NULL » n'a pas été déclaré dans ce cadre

error: ‘NULL’ was not declared in this scope 

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

Merci.

+2

Peut-être que vous n'avez pas déclaré NULL dans la portée de l'origine du message? –

+1

Vous devez au moins poster le 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épondre

160

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

#include <cstddef> 

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

+0

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 :) –

+13

En fait ce n'est pas un mot-clé dans Java non plus. –

+4

@ManofOneWay Non, il existe en Java, il est simplement épelé avec toutes les minuscules au lieu des majuscules. – Ataraxia

10

NULL n'est pas un mot-clé; c'est une substitution de macro pour 0, et vient en stddef.h ou cstddef, je crois. Vous n'avez pas #included un fichier d'en-tête approprié, donc g ++ voit NULL comme un nom de variable normal, et vous ne l'avez pas déclaré.

32

GCC prend des mesures vers 11 C++, ce qui est probablement la raison pour laquelle vous avez besoin maintenant d'inclure cstddef afin d'utiliser la NULL constante. La méthode préférée dans C++ 11 consiste à utiliser le nouveau mot-clé nullptr, implémenté dans GCC depuis la version 4.6. nullptr est pas implicitement convertible en types entiers, il peut donc être utilisé pour désambiguïser un appel à une fonction qui a été surchargé pour les deux types pointeur et intégrale:

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

f(0); // Passes int 0. 
f(nullptr); // Passes void * 0. 
+1

Mais encore C'est un comportement étrange! Même en compilant mon code avec -std = C++ 98, les images GCC ne reconnaissent pas la macro NULL et reconnaissent uniquement nullptr avec C++ 11 ou gnu ++ 11 comme argument pour -std. – pharaoh

+2

La norme C++ a déjà déclaré en 1998 que NULL est défini dans cstddef - les nouvelles versions du compilateur suivent simplement la norme de manière plus stricte 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 précédentes de GCC, en plus des versions antérieures de C++. –

+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 '' (ou ''). Comment gcc "prendre des mesures envers C++ 11" affecte-t-il cela? Je ne vois rien dans la question qui implique que le code (invisible) compilé avec les versions antérieures de gcc/g ++, ou avec des versions antérieures de la norme de langue. –

4

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

0

Vous pouvez déclarer la macro NULL. Ajoutez à cela après le vôtre #includes:

#define NULL 0 

ou

#ifndef NULL 
#define NULL 0 
#endif 

Non ";" au et des instrucions.

Questions connexes