2009-01-20 12 views
101

ich diese Meldung erhalten, wenn C++ kompiliert auf gcc 4,3Fehler: ‚NULL‘ wurde nicht in diesem Bereich erklärt

error: ‘NULL’ was not declared in this scope 

Es erscheint und verschwindet, und ich weiß nicht, warum. Warum?

Danke.

+2

Vielleicht haben Sie NULL nicht im Bereich der Herkunft der Nachricht deklariert? –

+1

Sie sollten mindestens das vollständige Stück Code, das den Fehler angibt, posten. Sonst ist es sehr schwierig zu erkennen, was passiert, wenn man sich nur die Fehlerkette ansieht. – Naveen

Antwort

160

NULL ist kein Schlüsselwort. Es ist eine Kennung, die in einigen Standardheadern definiert ist. Sie können umfassen

#include <cstddef> 

Um es in ihrem Umfang zu haben, darunter auch einige andere Grundlagen, wie std::size_t.

+0

Gott, ich bin so verwöhnt mit Java (null ist ein Schlüsselwort), dass ich nie gedacht hätte, dass NULL kein Schlüsselwort in C++ wäre. Danke :) –

+13

Eigentlich ist es auch kein Schlüsselwort in Java. –

+4

@ManofOneWay Nein, es existiert in Java, es wird nur mit Großbuchstaben anstelle von Großbuchstaben geschrieben. – Ataraxia

10

NULL ist kein Schlüsselwort; es ist eine Makrosubstitution für 0, und kommt in stddef.h oder cstddef, glaube ich. Sie haben nicht #included eine entsprechende Header-Datei, so g ++ sieht NULL als reguläre Variable Name, und Sie haben es nicht deklariert.

32

GCC unternimmt Schritte in Richtung C 11 ++, was wahrscheinlich ist, warum Sie jetzt brauchen cstddef aufzunehmen, um die NULL Konstante zu verwenden. Der bevorzugte Weg in C++ 11 besteht darin, das neue Schlüsselwort nullptr zu verwenden, das seit der Version 4.6 in GCC implementiert ist. nullptr ist nicht implizit konvertierbar integralen Typen, so kann es verwendet werden, um einen Aufruf einer Funktion eindeutig zu machen, die für beide Zeiger und Integraltypen überlastet wurde:

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

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

Aber immer noch Es ist ein seltsames Verhalten! Selbst das Kompilieren meines Codes mit -std = C++ 98 GCC Stills erkennt kein NULL-Makro und erkennt nur nullptr mit entweder C++ 11 oder gnu ++ 11 als Argument für -std. – pharaoh

+2

Der C++ - Standard hat bereits 1998 festgestellt, dass NULL in cstddef definiert ist - die neuen Compiler-Versionen folgen nur strenger dem Standard, weil sie nullptr implementieren müssen.Ihr (fehlerhafter) Code wurde mit früheren GCC-Versionen kompiliert, aber es wäre schwierig, zusätzlich zu früheren C++ - Standardversionen rückwärtskompatibel zu früheren GCC-Versionen zu bleiben. –

+0

'NULL' war noch nie ein eingebautes Schlüsselwort; Es ist ein Makro, das in mehreren Standard-C-Headern definiert ist, einschließlich '' (oder ''). Wie beeinflusst gcc "Schritte in Richtung C++ 11"? Ich sehe nichts in der Frage, die den (unsichtbaren) Code voraussetzt, der mit früheren Versionen von gcc/g ++ oder mit früheren Versionen des Sprachstandards kompiliert wurde. –

4

die anderen Antworten Abwicklung: Wenn Sie Verwenden Sie C++ 11, verwenden Sie nullptr, was ein Schlüsselwort ist, das einen leeren Zeiger bedeutet, der auf null verweist. (anstelle von NULL, der kein Zeigertyp ist)

0

Sie können das Makro NULL deklarieren. Hinzufügen, dass, nachdem es Ihr #includes:

#define NULL 0 

oder

#ifndef NULL 
#define NULL 0 
#endif 

Nein ";" an der und der Anweisungen.

Verwandte Themen