备忘一个宏的奇技淫巧,类似打印日志,RPC封装等无法使用C++0x变长模板参数的情况下,是个不错的选择
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #define ARG_COUNT_P1_(\ _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) \ N #define ARG_COUNT_P2_ \ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 #define ARG_COUNT_(...) \ ARG_COUNT_P1_(__VA_ARGS__) #define ARG_COUNT(...) \ ARG_COUNT_(_, ##__VA_ARGS__, ARG_COUNT_P2_) #define M_CAT(a, b) M_CAT_(a, b) #define M_CAT_(a, b) a##b #define VA_F(...) \ M_CAT(func, ARG_COUNT(__VA_ARGS__)) (__VA_ARGS__) #define func(a) fprintf(stdout, "arg:%ld\t", a); #define func0() fprintf(stdout, "func end\n\n"); #define func1(a) func(a); func0(); #define func2(a, ...) func(a); func1(__VA_ARGS__); #define func3(a, ...) func(a); func2(__VA_ARGS__); #define func4(a, ...) func(a); func3(__VA_ARGS__); #define func5(a, ...) func(a); func4(__VA_ARGS__); #define func6(a, ...) func(a); func5(__VA_ARGS__); #define func7(a, ...) func(a); func6(__VA_ARGS__); #define func8(a, ...) func(a); func7(__VA_ARGS__); #define func9(a, ...) func(a); func8(__VA_ARGS__); #define func10(a, ...) func(a); func9(__VA_ARGS__); int main(int argc, char **argv) { fprintf(stdout, "arg=%ld\n", ARG_COUNT()); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3,4)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3,4,5)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3,4,5,6)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3,4,5,6,7)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3,4,5,6,7,8)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3,4,5,6,7,8,9)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3,4,5,6,7,8,9,10)); fprintf(stdout, "arg=%ld\n", ARG_COUNT(1,2,3,4,5,6,7,8,9,10,11)); VA_F(); VA_F(1); VA_F(1,2); VA_F(1,2,3); VA_F(1,2,3,4); VA_F(1,2,3,4,5); VA_F(1,2,3,4,5,6); VA_F(1,2,3,4,5,6,7); VA_F(1,2,3,4,5,6,7,8); VA_F(1,2,3,4,5,6,7,8,9); VA_F(1,2,3,4,5,6,7,8,9,10); //VA_F(1,2,3,4,5,6,7,8,9,10,11); }