• J
    config: do not use C function names as struct members · 49d6cfa5
    Jeff King 提交于
    According to C99, section 7.1.4:
    
      Any function declared in a header may be additionally
      implemented as a function-like macro defined in the
      header.
    
    Therefore calling our struct member function pointer "fgetc"
    may run afoul of unwanted macro expansion when we call:
    
      char c = cf->fgetc(cf);
    
    This turned out to be a problem on uclibc, which defines
    fgetc as a macro and causes compilation failure.
    
    The standard suggests fixing this in a few ways:
    
      1. Using extra parentheses to inhibit the function-like
         macro expansion. E.g., "(cf->fgetc)(cf)". This is
         undesirable as it's ugly, and each call site needs to
         remember to use it (and on systems without the macro,
         forgetting will compile just fine).
    
      2. Using #undef (because a conforming implementation must
         also be providing fgetc as a function). This is
         undesirable because presumably the implementation was
         using the macro for a performance benefit, and we are
         dropping that optimization.
    
    Instead, we can simply use non-colliding names.
    Signed-off-by: NJeff King <peff@peff.net>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    49d6cfa5
config.c 41.7 KB