简单介绍一下:EXP宏,是用来做展开操作的。
ARGS_HELPER是从头向尾部展开,最小的数字1是最后一个位置
NUM_ARGS是用于获取宏当中参数...也就是拿到__VA_ARGS__的个数
下面来欣赏一下关键核心代码,以及宏注册部分的底层实现:
//目前宏支持到32个结构体属性基本上就够了
#define EXP(O) O
#ifdef _WIN32
#define ARGS_HELPER(_,_64,_63,_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,N,...) N
#define NUM_ARGS(...) EXP(ARGS_HELPER(0, __VA_ARGS__ ,64,63,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))
#else
#define ARGS_HELPER(_,_64,_63,_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,N,...) N
#define NUM_ARGS(...) ARGS_HELPER(0, __VA_ARGS__ ,64,63,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)
#endif
//注入属性方法,利用宏展开,可以用少量代码经过宏替换变成大量的重复代码
#define PROTO_1(k) #k
#define PROTO_2(k,...) #k, EXP(PROTO_1(__VA_ARGS__))
#define PROTO_3(k,...) #k, EXP(PROTO_2(__VA_ARGS__))
#define PROTO_4(k,...) #k, EXP(PROTO_3(__VA_ARGS__))
#define PROTO_5(k,...) #k, EXP(PROTO_4(__VA_ARGS__))
#define PROTO_6(k,...) #k, EXP(PROTO_5(__VA_ARGS__))
#define PROTO_7(k,...) #k, EXP(PROTO_6(__VA_ARGS__))
#define PROTO_8(k,...) #k, EXP(PROTO_7(__VA_ARGS__))
#define PROTO_9(k,...) #k, EXP(PROTO_8(__VA_ARGS__))
#define PROTO_10(k,...) #k, EXP(PROTO_9(__VA_ARGS__))
#define PROTO_11(k,...) #k, EXP(PROTO_10(__VA_ARGS__))
#define PROTO_12(k,...) #k, EXP(PROTO_11(__VA_ARGS__))
#define PROTO_13(k,...) #k, EXP(PROTO_12(__VA_ARGS__))
#define PROTO_14(k,...) #k, EXP(PROTO_13(__VA_ARGS__))
#define PROTO_15(k,...) #k, EXP(PROTO_14(__VA_ARGS__))
#define PROTO_16(k,...) #k, EXP(PROTO_15(__VA_ARGS__))
#define PROTO_17(k,...) #k, EXP(PROTO_16(__VA_ARGS__))
#define PROTO_18(k,...) #k, EXP(PROTO_17(__VA_ARGS__))
#define PROTO_19(k,...) #k, EXP(PROTO_18(__VA_ARGS__))
#define PROTO_20(k,...) #k, EXP(PROTO_19(__VA_ARGS__))
#define PROTO_21(k,...) #k, EXP(PROTO_20(__VA_ARGS__))
#define PROTO_22(k,...) #k, EXP(PROTO_21(__VA_ARGS__))
#define PROTO_23(k,...) #k, EXP(PRO