[cfe-dev] Fixing selector types on the GNU runtime
Howard Hinnant
hhinnant at apple.com
Sun Jan 18 14:55:37 PST 2009
On Jan 18, 2009, at 5:12 PM, Sebastian Redl wrote:
> Chris Lattner wrote:
>> On Jan 18, 2009, at 8:14 AM, David Chisnall wrote:
>>
>>> I've also included some fixes in this patch which turn NULL into
>>> (void*)0 when it is used as a sentinel in variadic functions. This
>>> gets rid of a load of warnings when compiling and stops it breaking
>>> on 64-bit architectures.
>>>
>>
>> Why are you getting this? There are tons of other places that pass
>> NULL as a sentinel. Is NULL getting defined incorrectly for that
>> file? NULL needs to be a pointer type, so it should be fine on 64-
>> bit
>> systems. Passing a raw "0" would not be.
>>
> In C++, NULL cannot be a pointer type, because there is no implicit
> cast
> from void* to other pointers. So it is usually defined to be 0 or
> 0L. In
> GCC, it's defined to be __null, but that's just 0 with a warning when
> used as an integer.
>
> So some compiler might be smart enough to convert its __null
> equivalent
> to pointer size when passed as vararg, or to define NULL to an integer
> constant that is actually the platform pointer size (e.g. 0L for GCC,
> but 0LL for MSVC), but I really wouldn't rely on it. The standard
> fails
> to specify that NULL must be as wide as a pointer (a defect IMO), so
> you
> can't trust the constant.
>
> It's one of the most subtle and evil gotchas in C++, really.
nullptr might be one of those C++0X features worth prioritizing.
-Howard
More information about the cfe-dev
mailing list