Re: macro conflict

From: Bill Pringlemeir (bpringle@sympatico.ca)
Date: Fri Aug 24 2001 - 09:20:00 EST


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



This archive was generated by hypermail 2b29 : Fri Aug 31 2001 - 21:00:09 EST