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.


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.


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.

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.


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)


0

NULL kann auch gefunden werden in:

#include <string.h>

String.h zieht den NULL von irgendwo anders ein.


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 ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.