🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #982

Re: Typ eines ?: Ausdruck?

#982
From: Ullrich von Bassewitz
Date: Fri, 08 Dec 1995 17:06
58 lines
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-mail
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>

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]