Fehler: 'NULL' wurde in diesem Bereich nicht deklariert

119

Ich erhalte diese Meldung beim Kompilieren von C ++ unter gcc 4.3

error: NULL was not declared in this scope

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

Vielen Dank.

Jackhab
quelle
2
Vielleicht haben Sie im Bereich, aus dem die Nachricht stammt, nicht NULL deklariert?
Paul Tomblin
1
Sie sollten mindestens den vollständigen Code veröffentlichen, der den Fehler verursacht. Andernfalls ist es sehr schwierig zu erkennen, was passiert, wenn Sie nur die Fehlerzeichenfolge betrachten.
Naveen

Antworten:

178

NULList kein Schlüsselwort. Es ist eine Kennung, die in einigen Standardheadern definiert ist. Sie können einschließen

#include <cstddef>

Um es im Umfang zu haben, einschließlich einiger anderer Grundlagen, wie std::size_t.

Johannes Schaub - litb
quelle
Gott, ich bin so verwöhnt von Java (null ist ein Schlüsselwort), dass ich nie gedacht hätte, dass NULL kein Schlüsselwort in c ++ sein würde. Danke :)
Stefan Hendriks
14
Eigentlich ist es auch in Java kein Schlüsselwort.
Mann der
4
@ManofOneWay Nein, es existiert in Java, es wird nur mit Kleinbuchstaben anstelle von Großbuchstaben geschrieben.
Ataraxia
8
@ ZettaSuro Ich habe nicht gesagt, dass es nicht existiert. Ich habe nur gesagt, dass es kein Schlüsselwort ist.
Mann der
8
Jetzt, da C ++ 11 allgemeiner von Compilern unterstützt wird, sollte das nullptrSchlüsselwort erwähnt werden, das ein tatsächliches Schlüsselwort ist und kein #includes erfordert . Es ist auch typsicherer als NULL.
Templatetypedef
38

GCC unternimmt Schritte in Richtung C ++ 11, weshalb Sie jetzt wahrscheinlich cstddef einschließen müssen, um die NULL- Konstante zu verwenden. In C ++ 11 wird bevorzugt das neue Schlüsselwort nullptr verwendet , das seit Version 4.6 in GCC implementiert ist. nullptr ist nicht implizit in integrale Typen konvertierbar, daher kann es verwendet werden, um einen Aufruf einer Funktion zu eindeutig zu machen, die sowohl für Zeiger- als auch für integrale Typen überladen wurde:

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

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.
Seppo Enarvi
quelle
1
Trotzdem ist es ein seltsames Verhalten! Selbst wenn ich meinen Code mit -std = c ++ 98 kompiliere, erkennen GCC-Standbilder kein NULL-Makro und erkennen nur nullptr mit c ++ 11 oder gnu ++ 11 als Argument für -std.
Pharao
2
Der C ++ - Standard hat bereits 1998 angegeben, dass NULL in cstddef definiert ist - die neuen Compilerversionen folgen nur strenger dem Standard, da 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 abwärtskompatibel mit früheren GCC-Versionen zu bleiben.
Seppo Enarvi
NULLwar noch nie ein eingebautes Schlüsselwort; Es ist ein Makro, das in mehreren Standard-C-Headern definiert ist, einschließlich <stddef.h>(oder <cstddef>). Wie wirkt sich gcc "Schritte in Richtung C ++ 11" darauf aus? Ich sehe nichts in der Frage, was impliziert, dass der (unsichtbare) Code mit früheren Versionen von gcc / g ++ oder mit früheren Versionen des Sprachstandards kompiliert wurde.
Keith Thompson
1
Genau das habe ich oben gesagt: Bereits in C ++ 98 wurde es in cstddef definiert. Trotzdem akzeptierte gcc (und auch andere Compiler) Code, der NULL verwendete, ohne zuerst cstddef einzuschließen. Ich bin mir ziemlich sicher, dass auch der fragliche (unsichtbare) Code mit früheren Versionen kompiliert wurde, obwohl er nicht streng standardkonform ist. Jetzt vermute ich nur, dass dieses strengere Verhalten moderner Versionen auf die Entwicklung des Compilers zur Unterstützung der C ++ 11-Syntax zurückzuführen ist.
Seppo Enarvi
10

NULList kein Schlüsselwort; Es ist eine Makrosubstitution für 0 und kommt herein stddef.hoder cstddef, glaube ich. Sie haben keine #includedentsprechende Header-Datei, daher wird in g ++ NULLein regulärer Variablenname angezeigt, und Sie haben ihn nicht deklariert.

David Thornley
quelle
5

So vervollständigen Sie die anderen Antworten: Wenn Sie C ++ 11 verwenden, verwenden Sie nullptrdieses Schlüsselwort, das einen ungültigen Zeiger bedeutet, der auf null zeigt. (statt NULL, was kein Zeigertyp ist)

Leonardo Raele
quelle
0

NULL kann auch gefunden werden in:

#include <string.h>

String.h zieht den NULL von irgendwo anders ein.

Eule
quelle
0

Sie können das Makro NULL deklarieren. Fügen Sie das hinzu, nachdem Sie #includes:

#define NULL 0

oder

#ifndef NULL
#define NULL 0
#endif

Nein ";" am Ende der Anleitung ...

Derzu
quelle