Article View: de.comp.lang.c++
Article #982Re: Typ eines ?: Ausdruck?
From: Ullrich von Bassewitz
Date: Fri, 08 Dec 1995 17:06
Date: Fri, 08 Dec 1995 17:06
58 lines
2955 bytes
2955 bytes
Dietmar Kuehl (kuehl@uzwil.informatik.uni-konstanz.de) wrote:
> Ullrich von Bassewitz (uz@wuschel.ibb.schwaben.com) wrote:
> : Das ist falsch und wuerde auch ueberhaupt nicht funktionieren, da in C++
> : eine Konvertierung von void* in einen anderen Zeigertyp (im Gegensatz zu C)
> : nicht automatisch durchgefuehrt wird.
>
> Es ist korrekt, dass es nicht funktionieren wuerde. Es funktioniert ja
> auch nicht :-) ... nur um die Aussage "das ist falsch" mal in Frage zu
> stellen: Wie hast Du rausgefunden, das 'NULL' nicht '((void*)0)' ist,
> wenn man den gcc verwendet? Ich habe es mit dem Compiler gemacht,
Das ist viel zu viel Aufwand :-)
In C++ ist ein void Zeiger nicht zuweisungskompatibel zu einem typisierten
Zeiger (wie in C). D.h. das Statement
char* S = malloc (100);
erzeugt immer eine Fehlermeldung des Compilers, weil er nicht implizit das
Ergebnis von malloc (void*) nach char* castet.
Aus dem Grund _kann_ NULL ueberhaupt nicht als (void*)0 definiert sein, weil
das unter C++ nicht funktionieren wuerde!
Das zeigt auch mein Zitat aus stdio.h, dort ist NULL fuer g++ und fuer gcc
verschieden definiert.
Deine Aussage bezueglich der Definition von NULL kann insofern stimmen, als
g++ (zumindest die Version die ich hier habe) einen Bug hat, was das angeht:
char* S = (void*)0;
Wird auch mit -Wall ohne zu meckern uebersetzt. Dagegen wird
void* X = 0;
char* S = X;
mit einer Warnung bedacht ("ANSI-C++ forbids implicit conversion..."). Das
zweite Beispiel zeigt dabei, dass beim ersten eigentlich auch eine Warnung
kommen sollte, der Text der Warnung ("ANSI-C++ forbids...") zeigt, dass dies
eigentlich ein Fehler und keine Warnung sein sollte. Ich vermute mal, dass
der Sinn davon ist, moeglichst viel alten Code am Laufen zu halten, auch
solchen, der NULL selber definiert und keine Header-Files einbindet.
Andere Compiler brechen hier tataechlich mit einem Fehler ab.
Wo Du recht hast und was ich probieren koennte, ist anstatt von NULL 0 zu
verwenden. Wenn das das Problem loesen sollte, dann wird die Geschichte aber
eher zweifelhafter, weil es ja wohl kaum richtig sein kann, wenn der Ersatz
von 0 in einem Zeiger-Kontext durch NULL ploetzlich Warnungen produziert.
Das sollte nicht der Sinn von NULL sein (siehe C-FAQ).
Gruss
Uz
--
Ullrich von Bassewitz uz@ibb.schwaben.com
Technical Details
Message-ID:
<KLF7B8KU@wuschel.ibb.schwaben.com>Path:
arc1-ca.pugleaf.net!wuschel.ibb.schwaben.com!not-for-mailReferences:
<RCD7B0RH@wuschel.ibb.schwaben.com> <30c5f4ed.0@minerva.rz.uni-konstanz.de> <L0D7BOZL@wuschel.ibb.schwaben.com> <30c77c78.0@minerva.rz.uni-konstanz.de>Show Full Headers
Complete Article Headers
Newsgroups: de.comp.lang.c++ Path: arc1-ca.pugleaf.net!wuschel.ibb.schwaben.com!not-for-mail From: uz@wuschel.ibb.schwaben.com (Ullrich von Bassewitz) Subject: Re: Typ eines ?: Ausdruck? Date: 08 Dec 1995 17:06:56 GMT References: <RCD7B0RH@wuschel.ibb.schwaben.com> <30c5f4ed.0@minerva.rz.uni-konstanz.de> <L0D7BOZL@wuschel.ibb.schwaben.com> <30c77c78.0@minerva.rz.uni-konstanz.de> Message-ID: <KLF7B8KU@wuschel.ibb.schwaben.com> Reply-To: uz@ibb.schwaben.com Organization: Ingenieurbuero von Bassewitz X-Newsreader: TIN [version 1.2 PL2]