#include #define PP_NARG(...) \ PP_NARG_(__VA_ARGS__,PP_RSEQ_N()) #define PP_NARG_(...) \ PP_ARG_N(__VA_ARGS__) #define PP_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 PP_RSEQ_N() \ mock63, mock62, mock61, mock60, mock59, mock58, mock57, mock56, mock55, mock54,\ mock53, mock52, mock51, mock50, mock49, mock48, mock47, mock46, mock45, mock44,\ mock43, mock42, mock41, mock40, mock39, mock38, mock37, mock36, mock35, mock34,\ mock33, mock32, mock31, mock30, mock29, mock28, mock27, mock26, mock25, mock24,\ mock23, mock22, mock21, mock20, mock19, mock18, mock17, mock16, mock15, mock14,\ mock13, mock12, mock11, mock10, mock9, mock8, mock7, mock6, mock5, mock4,\ mock3, Ensure2, Ensure1, Ensure1 #define Ensure1(p1) void spec__##p1() #define Ensure2(p1, p2) void tag__##p1##_spec__##p2() #define Ensure(...) PP_NARG(__VA_ARGS__)(__VA_ARGS__) Ensure(do_something) { printf("Ensure: spec\n"); } Ensure(zzz, do_something_else) { printf("Ensure: noun / spec\n"); } int main (void) { return 0; }