Macros, which depends on arguments.


  • QA Engineer

    It wants a macroc, which expands differently depending on whether or not it has arguments. Example:

    _return();     /* расширяется в return(0xDEAFBEEF); */
    _return(a+b);  /* расширяется в return(a+b);        */
    

    How?

    In principle, it's on. https://groups.google.com/d/msg/comp.std.c/d-6Mj5Lko_s/jqonQLK20HcJ but what? Well, we've learned how many arguments, and...



  • I've got a little fix on the reference set. That's what happened:

    #define __VA_NARG__(...) \
            __VA_NARG_(_0, ## __VA_ARGS__, __RSEQ_N())
    #define __VA_NARG_(...) \
            __VA_ARG_N(__VA_ARGS__)
    #define __VA_ARG_N( \
             _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
            _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
            _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
            _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
            _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
            _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
            _61,_62,_63,N,...) N
    #define __RSEQ_N() \
            62, 61, 60,                             \
            59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
            49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
            39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
            29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
            19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
             9,  8,  7,  6,  5,  4,  3,  2,  1,  0
    

    #define JOIN(x,y) _JOIN(x,y)
    #define _JOIN(x,y) x##y

    #define r(...) JOIN(r,VA_NARG(VA_ARGS))(VA_ARGS)
    #define r0() nullargs()
    #define r1(x) oneargs(x)

    r(x);
    r();

    Testing gcc. Got all the substations:

    oneargs(x);
    nullargs();

    Double transmission of JOIN-state_JOIN-state## - otherwise macro-arguments are not turning.

    Preprocessary operation ## clicking without gaps and getting a new identifier. In macroes with variable number of arguments ## after comma and before VA_ARGS cleans up the comma if there's no argument, it's extension gcc, so other compilers may not work.




Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2