[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