Yep. They all suck. As Dennis said, “C is quirky” and part of the issue is HW is even more so. Clem On Sun, Sep 20, 2020 at 8:10 PM Warner Losh wrote: > To two places: stddef.h and stdlib.h :(. > > It's interesting to see the different bugs 0, 0L, (char *)0 and (void *)0 > expose or hide as definitions of NULL. > > 0 is fine if sizeof(int) == sizeof(void *). Otherwise varadic function > calls break. 0L is the same, but for long. The pointer definitions run into > trouble in other contexts since NULL is often incorrectly used as a > terminating byte in a string instead of '\0'. (void *) has issues with > const pointers, some of which are relevant if you use it in the wrong > context. > > There were quite spirited debates back in the day for which one was best. > They all suck. C++ invented a null pointer symbol because it's type rules > were enough different than C to make a universal NULL #define impossible. > Is that better or worse? Don't know. It's different. > > Glad to see the null-pointer need not have all zero bits being different > than a 0 constant shall be the null-pointer in sufficient detail. > > Warner > > On Sun, Sep 20, 2020, 5:54 PM Clem Cole wrote: > >> Norman NULL has to be defined and I said that/showed it. The standard >> says where. I was not trying to compile NULL without a definition which I >> agree it not legal. If that is what Doug was implying I missed understood >> him but I note NULL was introduced in Typesetter C /V7 where those compiler >> s set it to 0 in studio but the ANSI/ISO moved it. >> >> On Sun, Sep 20, 2020 at 7:03 PM Norman Wilson wrote: >> >>> Doug McIlroy: >>> >>> >>> >>> To put it more strongly. this is not a legal C source file. >>> >>> char *s = NULL; >>> >>> But this is. >>> >>> char *s = 0; >>> >>> >>> >>> Clem Cole: >>> >>> >>> >>> 67)The macro NULL is defined in (and other headers) as a >>> null >>> >>> pointer constant; see 7.19. >>> >>> >>> >>> ==== >>> >>> >>> >>> $ cat null.c >>> >>> char *s = NULL; >>> >>> $ cat zero.c >>> >>> char *s = 0; >>> >>> $ >>> >>> >>> >>> zero.c is a legal C program. null.c is not. Create >>> >>> files exactly as shown and compile them if you don't >>> >>> believe me. >>> >>> >>> >>> Prepend `#include ' (or or ) >>> >>> to null.c and it becomes legal, but I think that's Doug's >>> >>> point: you need an include file. >>> >>> >>> >>> Personally I prefer to use NULL instead of 0 when spelling >>> >>> out a null pointer, because I think it's clearer: >>> >>> if ((buf = malloc(SIZE)) == NULL) >>> >>> error("dammit andrew"); >>> >>> though I am willing to omit it when there's no confusion >>> >>> about = vs ==: >>> >>> if (*p) >>> >>> dammit(*p, "andrew"); >>> >>> >>> >>> But that's just a question of style, and Doug's is fine too. >>> >>> >>> >>> The language does not require the compiler to pre-define >>> >>> NULL or to recognize it as a keyword; you have to include >>> >>> an appropriate standard header file. >>> >>> >>> >>> Norman Wilson >>> >>> Toronto ON (not 0N nor NULLN) >>> >>> -- >> Sent from a handheld expect more typos than usual >> >> >> > > -- Sent from a handheld expect more typos than usual