Revisiting generalized lvalues

Michael Krasnik mike@genlogic.com
Sat Oct 29 16:59:00 GMT 2005


Andrew Pinski wrote:
>>I don't know if it's too late, but there is yet another reason
>>for the use of generalized lvalues besides just ignorance:
>>using them in macros that verify pointer and struct usage
>>in a large framework. A comma expression makes it very
>>convenient, for example (just a general idea):
>>
>>#ifdef  PRODUCTION
>>#define X_ABC(x)       ( check( x ), x->abc )
>>#else
>>#define X_ABC(x)        x->abc
>>#endif
>>
>>which expands
>>
>>     X_ABC(x) = y;
>>
>>to:
>>
>>     ( check( x ), x->abc ) = y;
>>
>>It is something that is used during development only and
>>is switched off for the production builds. C++ compatibility
>>is not an issue either.
> 
> 
> 
> GCC does this through another extension, like:
> #ifdef CHECKING
> #define CHECK_X(x)   	({const tree __t = x; check(__t); __t; })
> #else
> #define CHECK_X(x)	x
> #endif
> #define X_ABC(x) 	CHECK_X(x)->abc
> 
> 
> -- Pinski
> 

Your example is a fancier way of rewriting our macros as:

#ifdef  PRODUCTION
#define X_ABC(x)       ( check( x ), &x )->abc
#else
#define X_ABC(x)        x->abc
#endif

to get around the "invalid lvalue" error. It's fine for a
distilled simple example, but quickly becomes ugly for
real multi-level nested macros. Well, I guess we have to
forget about elegance and use the same tricks we do for
other compilers...

Thanks,

/m



More information about the Gcc mailing list