Article View: de.comp.lang.c++
Article #977Re: Typ eines ?: Ausdruck?
From: Dietmar Kuehl
Date: Thu, 07 Dec 1995 23:44
Date: Thu, 07 Dec 1995 23:44
125 lines
4859 bytes
4859 bytes
Hi, Ullrich von Bassewitz (uz@wuschel.ibb.schwaben.com) wrote: : Dietmar Kuehl (kuehl@uzwil.informatik.uni-konstanz.de) wrote: : > Der Trick liegt daran, dass 'NULL' beim gcc als '(void*)0' definiert : > ist. Das ist nach DWP 18.1 (lib.support.types) [Fussnote 135 im April : > DWP] nicht zulaessig: "Possible definitions inlucde 0 and 0L, but not : > (void*)0". : 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, indem ich nur den Praeprozessorschritt habe machen lassen und mir angeguckt habe, zu was 'NULL' denn gerade definiert ist. Das (ueberraschende; das hatte ich naemlich wirklich nicht erwartet) Ergebnis, wenn man sich das fuer ALLE Headerfiles anguckt, ist, dass 'NULL' in libg++-2.7.1 NICHT konsistent definiert ist. Hier ist eine Liste der Header (mit ihren ANSI/ISO Namen) und wie 'NULL' definiert ist. Wenn in der Liste 'NULL' steht, so wurde entweder 'NULL' nicht definiert oder es gibt kein Headerfile in libg++ was ungefaehr dem entsprechenden ANSI/ISO Header entspricht: algorithm: ((void *)0) bitset: NULL complex: ( 0) deque: ((void *)0) exception: NULL fstream: ((void*)0) functional: NULL iomanip: ((void*)0) ios: ((void*)0) iosfwd: ((void*)0) iostream: ((void*)0) istream: ((void*)0) iterator: ((void *)0) limits: NULL list: ((void *)0) locale: NULL map: ((void *)0) memory: ((void *)0) new: ((void *)0) numeric: ((void *)0) ostream: ((void*)0) queue: NULL set: ((void *)0) sstream: NULL stack: NULL stdexcept: NULL streambuf: ((void*)0) string: ((void *)0) typeinfo: NULL utility: NULL valarray: NULL vector: ((void *)0) cassert: NULL cctype: NULL cerrno: NULL cfloat: NULL ciso646: NULL climits: NULL clocale: 0 cmath: ( 0) csetjmp: NULL csignal: 0 cstdarg: NULL cstddef: ((void *)0) cstdio: ( 0) cstdlib: 0 cstring: 0 ctime: 0 cwchar: ((void *)0) cwctype: ( 0) Diese Liste habe ich automatisch erstellen lassen, indem ich folgendes C++ Programm Preprocessed habe (mit g++ -E tst.cc): #include <headername> NULL Dabei wurde 'headername' mittels sed auf den jeweils entsprechenden Namen in libg++-2.7.1 gesetzt. : Das hier ist aus /usr/include/stdio.h: 'stdio.h' ist eins von 50 Standard Header, die es in ANSI/ISO gibt. Warum sollte ausgerechnet die Definition aus 'stdio.h' genommen werden? : #ifndef NULL : #ifdef __cplusplus : #define NULL 0 : #else : #define NULL (void*)0 : #endif : #endif Das deckt sich zwar nicht mit dem Ergebnis, was ich fuer stdio.h gefunden habe '( 0)', aber es kann sein, dass die Definition in stdio.h (ANSI/ISO Name ist uebrigens '<cstdio>') aus einen Headerfile stammt, dass von stdio.h included wurde. : > Die Konversion, die der gcc in diesem Fall macht ja, die Definition von : > 'NULL' nicht. Der Fehler wird am Einfachst dadurch behoben, dass man : > anstelle von 'NULL' einfach '0' verwendet. Am Anfang musste ich mich : > auch daran gewoehnen (ich habe lange C programmiert, bevor ich auf C++ : > umgestiegen bin), aber inzwischen finde ich 'NULL' ziemlich haesslich. : Das scheint auf jeden Fall nicht die Antwort zu sein, weil Deine Annahme : (NULL == (void*)0) falsch ist. Ich will mich nicht auf einen Streiterei einlassen, behaupte aber, insbesondere mit Ruecksicht auf die oben angefuehrten Argumente, dass meine Erklaerung korrekt ist. Solange wie nicht jemand eine andere, schluessige Erklaerung liefert, werde ich mich auch von Behauptungen, die das Problem nicht unbedingt beeinflussen, etwa dass 'NULL' doch in 'stdio.h' richtig definiert wird, nicht beirren lassen. -- dietmar.kuehl@uni-konstanz.de http://www.informatik.uni-konstanz.de/~kuehl I am a realistic optimist - that's why I appear to be slightly pessimistic
Technical Details
Message-ID:
<30c77c78.0@minerva.rz.uni-konstanz.de>Path:
arc1-ca.pugleaf.net!minerva.rz.uni-konstanz.de!uzwil!kuehlReferences:
<RCD7B0RH@wuschel.ibb.schwaben.com> <30c5f4ed.0@minerva.rz.uni-konstanz.de> <L0D7BOZL@wuschel.ibb.schwaben.com>Show Full Headers
Complete Article Headers
From: kuehl@uzwil.informatik.uni-konstanz.de (Dietmar Kuehl) Subject: Re: Typ eines ?: Ausdruck? Newsgroups: de.comp.lang.c++ References: <RCD7B0RH@wuschel.ibb.schwaben.com> <30c5f4ed.0@minerva.rz.uni-konstanz.de> <L0D7BOZL@wuschel.ibb.schwaben.com> Organization: Fakultät für Mathematik und Informatik Reply-To: dietmar.kuehl@uni-konstanz.de X-Newsreader: TIN [version 1.2 PL2] NNTP-Posting-Host: minerva.rz.uni-konstanz.de Message-ID: <30c77c78.0@minerva.rz.uni-konstanz.de> Date: 7 Dec 95 23:44:56 GMT Path: arc1-ca.pugleaf.net!minerva.rz.uni-konstanz.de!uzwil!kuehl