Re: macro conflict

Bill Pringlemeir (bpringle@sympatico.ca)
24 Aug 2001 10:20:00 -0400


>>>> kaos@ocs.com.au said:

>> Did you try that? Firstly typeof() is only defined in declaration
>> context, it gets an error when used in an expression. Secondly
>> typeof() is not expanded by cpp so the stringify tricks do not
>> work. typeof(x) is handled by cc, not cpp.

>>>>> "David" == David Woodhouse <dwmw2@infradead.org> writes:

David> No. It's far too silly for me to have actually tried it :)

David, you wild and crazy guy! How crazy is this,

#define real_min(x,y) ({ typeof((x)) _x = (x); typeof((y)) _y = (y); (_x>_y)?_y:_x; })
#define min(x,y) ({extern void BUG(void); typeof(x) _x = 0; typeof(y) _y = 0; \
if (sizeof(typeof(x)) != sizeof(typeof(y)) || \
(_x-1 > 0 && _y-1 < 0) || (_x-1<0 && _y-1>0)) \
BUG(); \
real_min(x,y); })

int main(int argc, char *argv[])
{
int ix,iy;
unsigned int ux,uy;
long lx,ly;
unsigned long Ux,Uy;

ux = min(ix,uy);
return 0;
}

sh> gcc -Wall test.c -O2 test

This is a little slimmy as the sizeof will evaluate the to same thing
on some architectures for long/int or short/int. Even worse, it won't
handle pointers. The macro is `physically correct' if a short/int are
the same. Actually, you would probably want to cast up to which ever
is the bigger of the types to fully handle the precision. Maybe the
sizeof() test isn't even needed due to promotion. Just the signs are
important (afaik) and a test for pointer and integral mixing which I
cann't think of. Maybe some clever use of arrays or "+ *x" or
something.

fwiw,
Bill Pringlemeir.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/