Subject: Re: sys/null.h
To: Roland Illig <roland.illig@gmx.de>
From: Greg A. Woods <woods@weird.com>
List: tech-userlevel
Date: 04/15/2005 15:51:46
[ On Wednesday, April 13, 2005 at 18:09:32 (+0200), Roland Illig wrote: ]
> Subject: sys/null.h
>
> * What happens on I32LP64 systems?
> fprintf(stderr, "%#p %#p\n", NULL, NULL, 1, 2, 3, 4);
> I would expect the answer to not be "0x0 0x0".
You forgot the _necessary_ parameter casts.
Just because you're using C with prototypes doesn't mean you can get
away without casting some parameters to varargs/stdargs functions.
In fact when you use "%p" you really should always cast the relevant
parameter using "(void *)", even if it is already some other type of
pointer because "%p" is only defined for pointers to "void" objects.
Besides, portable code _MUST_ acknowledge that NULL may be defined as
the plain integer value zero.
> * Why don't we always #define NULL ((void *) 0) ?
Sane use of NULL in C does not require it to be anything but a plain
integer zero, and indeed anything else can cause far more headaches and
confusion than is necessary since NULL gets used in real code in many
places where a pointer type is not desired. (Maybe it shouldn't be, but
that's the way it is; and the standard doesn't really preclude the use
of the NULL macro in many of the places were a pointer type is not
desired either.)
> (We don't have to be pre-ANSI compatible anyway.)
Yes, NetBSD _MUST_ be able to compile both pre-ANSI code and code that
uses NULL as an int or char value thus the public headers really must
use a plain integer zero for NULL.
--
Greg A. Woods
H:+1 416 218-0098 W:+1 416 489-5852 x122 VE3TCP RoboHack <woods@robohack.ca>
Planix, Inc. <woods@planix.com> Secrets of the Weird <woods@weird.com>