[vox-tech] C preprocessor - "soft reference"?
Micah Cowan
micah at cowan.name
Thu Jan 18 13:49:19 PST 2007
On Thu, 2007-01-18 at 13:20 -0800, Micah Cowan wrote:
> #define CHECK_FOR_NULLITITY(var) \
> if ( (var) == NULL ) \
> { \
> printf("%s is null.\n", #var); \
> exit(EXIT_FAILURE); \
> }
Forgot to point out, that since the # stringizing operator produces a
string literal, you might make things just /slightly/ more efficient by
taking advantage of C's string literal concatenation:
#define CHECK_FOR_NULLITITY(var) \
if ( (var) == NULL ) \
{ \
puts( #var " is null." ); \
exit(EXIT_FAILURE); \
}
Also, in real applications you might consider printing that to stderr,
since that's where most folks expect error logging to happen--and
especially if you put other, legit text on stdout.
In case you feel like playing around with the # operator, be aware that
the stringizing operation takes place before macros within arguments are
expanded recursively. So, if you were to try something like:
#define MY_EXPRESSION (__foo->special_ptr)
CHECK_FOR_NULLITY(MY_EXPRESSION) would print out "MY_EXPRESSION is
null", rather than "(__foo->special_ptr) is null". To fix this, you can
force the stringization to happen after the parameter has been expanded,
with something like:
#define DO_STR(a) #a
#define CHECK_FOR_NULLITITY(var) \
... /* use DO_STR(var) instead of #var */ ...
(Oh, hey, just noticed there's too many ITs in NULLITITY :) )
This will expand out any macros in var before using it as the argument
to the DO_STR() macro.
--
Micah J. Cowan
Programmer, musician, typesetting enthusiast, gamer...
http://micah.cowan.name/
More information about the vox-tech
mailing list