Ken Raeburn wrote:
In my experience NULL has usually been defined as somthing like ((void *)0). In any event it should be defined to be somthing that is safe to use as a pointer. It probably shouldn't be defined as just 0 unless int and pointers are, in fact, interchangable on that archetecture. Don't rule out the possibility of broken archetectures.On May 3, 2008, at 16:49, Davis Johnson wrote:Rule 1 includes using NULL for null pointer values and not 0. It also includes using %p to format pointer values. There are probably some other things I should add.NULL may be defined as 0, though. In calling a variadic function like printf, *always* cast NULL (or 0) to the correct pointer type expected by the function; the compiler should automatically convert NULL or 0 as needed in most other contexts. In fact, for variadic functions, you should also make sure your integral-typed arguments are of the correct types, because passing a 64-bit long where the function expects a 32-bit int (or vice versa) may cause a mismatch in stack layout calculations.Ken _______________________________________________ axp-list mailing list axp-list redhat com https://www.redhat.com/mailman/listinfo/axp-list
K&R C didn't have a void type so older programs (and implementations) may not use (or have) it.
The point about variadic functions is well taken. This is related to why I sugested being warry of home-rolled variadic parameter schemes. They are out there because some of these programs may predate va_arg. For non-variadic functions prototypes will make the compiler take care of appropriate casts, or give appropriate warnings. For variadic functions you need to do the work. GCC allows you to declare functions as fprintf-like and it will check functions against the format, but otherwise it is up to you.
Casting to the right pointer type is somthing I skimp on because everything I've written code for for a long time has had the same pointer representation for anything. That is lazy, however. You are correct that arguments to variadic functions should be correctly cast.