🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Typ eines ?: Ausdruck?

#977
From: Dietmar Kuehl
Date: Thu, 07 Dec 1995 23:44
125 lines
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!kuehl
References: <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