From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joe Buck To: Olivier.Galibert@mines.u-nancy.fr (Olivier Galibert) Cc: egcs@cygnus.com Subject: Re: linux libio status Date: Wed, 15 Oct 1997 11:12:00 -0000 Message-id: <199710151604.JAA22390@atrus.synopsys.com> References: <19971015095211.03621@renaissance.loria.fr> X-SW-Source: 1997-10/msg00587.html > > On Tue, Oct 14, 1997 at 11:23:49PM -0700, Joe Buck wrote: > > We need to silence these warnings. For the NULL, I suggest a global > > s/NULL/0/ in the C++ iostreams headers. There is no reason to write > > NULL, it is just a source of problems like this (*especially* since > > we have changed C++ to be strict about void*). > > Don't use '0' but '0L'. This way you will be OK with NULL in stdargs > when int=32b and pointer=64b. And you'll be broken on platforms where sizeof(long) != sizeof(pointer), or at least you would if it weren't for the fact that C++ requires prototypes for all functions. Remember, we are talking about C++ here, not C. Stroustrup says (The C++ Programming Language, 3rd Edition, p. 88) "Because of C++'s tighter type checking, the use of plain 0, rather than any suggested NULL macro, leads to fewer problems. If you feel that you must define NULL, use const int NULL = 0; ..." There is a similar discussion in the comp.lang.c++ FAQ. In C++, there are always prototypes. Thus 0 or 0L makes no difference, and in fact the "standard null pointer" is essentially 0 in C++. The argument is coerced to the proper pointer. However, standard C++ does not let you convert (void *) to (T *) without a cast, so defining NULL as (void *)0 is completely broken in C++. It used to work in g++, but that was an extension (furthermore this extension prevented g++ from implementing the standard overloading rules correctly). Hence The only exception is functions with ... in their spec. Here, neither 0 nor 0L will result in portable code. Your suggestion switches the erroneous assumption that sizeof(T *) == sizeof(int) with another erroneous assumption, that sizeof(T *) == sizeof(long). Worse, you leave users with the idea that they can safely use NULL for any null pointer type, even in variadic functions. Sorry, you can't do that in standard C++. For variadic functions, users must declare any optional arguments correctly, period. Conclusion: we should deprecate the use of NULL in C++ code. If we must define NULL for C++ code, it must be 0. Nothing else.