Definition of NULL
John Baldwin
jhb at freebsd.org
Mon May 4 19:22:23 UTC 2009
On Saturday 02 May 2009 11:59:03 am Andrew Brampton wrote:
> I'm writing a C++ Kernel Module, and one thing that has been bugging
> me is the kernel's definition of NULL.
>
> sys/sys/_null.h (in CURRENT):
>
> #if defined(_KERNEL) || !defined(__cplusplus)
> #define NULL ((void *)0)
> #else
> #if defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4
> #define NULL __null
> #else
> #if defined(__LP64__)
> #define NULL (0L)
> #else
> #define NULL 0
> #endif /* __LP64__ */
> #endif /* __GNUG__ */
> #endif /* _KERNEL || !__cplusplus */
>
> >From what I've read online the definition of NULL in C is (void *)0,
> whereas in C++ it should be 0, or 0L (on 64bit machines).
>
> Now, my C++ kernel module is built with _KERNEL definited, like any
> other C kernel module. This leads to NULL being defined incorrectly.
>
> So I have a question and two suggestions. Firstly, why is the #if
> defined(_KERNEL) in _null.h? Is it to stop userland application
> applications picking up this definition? Or for another reason?
Yes. NULL used to be 0. When it was changed to '(void *)0' I believe it
broke several applications in ports. As a compromise, NULL was restored back
to 0 in userland and only set to '(void *)0' in the kernel.
> and two, how about we change the first line of _null.h so that we use
> a && instead of a || like so:
> #if defined(_KERNEL) && !defined(__cplusplus)
I think this would be ok to let C++ work in the kernel. "Embedded" C++ (no
exceptions and no dynamic_cast<>) should work fine in theory. I would not
change the value of NULL that userland sees though as I think that may be too
risky.
--
John Baldwin
More information about the freebsd-hackers
mailing list