lkml.org 
[lkml]   [2001]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [BUG] Bad #define, nonportable C, missing {}
    Date
    On Wednesday 21 November 2001 13:52, Mathijs Mohlmann wrote:
    > On 21-Nov-2001 Jan Hudec wrote:
    > >> Go read up on C operator precedence. Unary ++ comes before %, so if we
    > >> rewrite the #define to make it more "readable" it would be #define
    > >> MODINC(x,y) (x = (x+1) % y)
    > >
    > > *NO*
    > > MODINC(x,y) (x = (x+1) % y)
    > > is correct and beaves as expected. Unfortunately:
    > > MODINC(x,y) (x = x++ % y)
    > > is a nonsence, because the evaluation is something like this
    > > x++ returns x
    > > x++ % y returns x % y
    > > x is assigned the result and it's incremented IN UNDEFINED ORDER!!!
    > > AFAIK the ANSI C spec explicitly undefines the order.
    >
    > in fact, gcc does (according to my tests):
    > MODINC(x,y) (x = (x % y) + 1)

    drivers/message/i2o/i2o_config.c:#define MODINC(x,y) (x = x++ % y)

    Alan, can you clarify what this macro is doing?
    What about making it less confusing?
    --
    vda
    -
    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/

    \
     
     \ /
      Last update: 2005-03-22 13:13    [W:0.021 / U:152.256 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site