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:
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.
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)
Antworten:
NULL
ist kein Schlüsselwort. Es ist eine Kennung, die in einigen Standardheadern definiert ist. Sie können einschließenUm es im Umfang zu haben, einschließlich einiger anderer Grundlagen, wie
std::size_t
.quelle
nullptr
Schlüsselwort erwähnt werden, das ein tatsächliches Schlüsselwort ist und kein#include
s erfordert . Es ist auch typsicherer alsNULL
.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:
quelle
NULL
war 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.NULL
ist kein Schlüsselwort; Es ist eine Makrosubstitution für 0 und kommt hereinstddef.h
odercstddef
, glaube ich. Sie haben keine#included
entsprechende Header-Datei, daher wird in g ++NULL
ein regulärer Variablenname angezeigt, und Sie haben ihn nicht deklariert.quelle
So vervollständigen Sie die anderen Antworten: Wenn Sie C ++ 11 verwenden, verwenden Sie
nullptr
dieses Schlüsselwort, das einen ungültigen Zeiger bedeutet, der auf null zeigt. (stattNULL
, was kein Zeigertyp ist)quelle
NULL kann auch gefunden werden in:
String.h zieht den NULL von irgendwo anders ein.
quelle
Sie können das Makro NULL deklarieren. Fügen Sie das hinzu, nachdem Sie #includes:
oder
Nein ";" am Ende der Anleitung ...
quelle