[lkml]   [2001]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectRe: macro conflict

>>>> 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 <> 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

Bill Pringlemeir.

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
More majordomo info at
Please read the FAQ at

 \ /
  Last update: 2005-03-22 12:58    [W:0.047 / U:1.212 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site