#define MY_EXPAND __VA_ARGS__ #define MY_COUNTER(_1, _2, _3, _4, _5, _6, _7, x, ...) x #define MY_ARG_COUNT(...) MY_EXPAND(MY_COUNTER(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1)) // overloader #define MY_CAT(a, b) a##b #define MY_OVERLOAD(macroName, ...) MY_EXPAND(MY_CAT(macroName, MY_ARG_COUNT(__VA_ARGS__))(__VA_ARGS__)) // Selectors for given number of args #define MY_LAST_ARG(...) MY_OVERLOAD(MY_OVERLOADED_FNC, __VA_ARGS__) #define MY_LAST_ARG1(_1) _1 #define MY_LAST_ARG2(_1, _2) _2 #define MY_LAST_ARG3(_1, _2, _3) _3 #define MY_LAST_ARG4(_1, _2, _3, _4) _4 #define MY_LAST_ARG5(_1, _2, _3, _4, _5) _5 #define MY_LAST_ARG6(_1, _2, _3, _4, _5, _6) _6 #define MY_LAST_ARG7(_1, _2, _3, _4, _5, _6, _7) _7 // our calls MY_LAST_ARG(one, two, three) MY_LAST_ARG(apple, orange, banana, pineapple)