Me? I don't like macros like ZERO and ONE... but I use NULL all the time.
I suppose I like to read some type information in values... I tend to use true and false (or TRUE and FALSE) over 1 and 0... just because the booleanness is important...
Well, NULL is unfortunately one of the more abused macros... a lot of old systems have it #defined as something weird (like ((void*)0L) or worse) and it breaks some compilers...
I just require that the build environment be sane (#define NULL 0 ). There are pros and cons either way, and it is a religious issue for many, but so long as your build environment gives me a proper type-promotable zero that compiles with strict ISO-C and C++ without significant grief then I just don't care... I prefer to read that I'm looking at a null pointer, rather than wonder about what foo = 0 means in the middle of some oddball function.
And, like TRUE and FALSE, the NULL macro should not be used except as an assignment rvalue. Don't use it in comparisons and the like -- let the language do the proper handling: if (ptr)
instead of if (ptr != NULL)if (NULL != ptr)
etc, because it will break on older, stupider systems.
The preprocessor was designed to make some tasks easier -- not to promote radical language modification or code obfuscation. A lot of weird macros usually indicates bad code.