中级会员
 
- 积分
- 354
- 金钱
- 354
- 注册时间
- 2018-9-14
- 在线时间
- 157 小时
|

楼主 |
发表于 2018-11-12 13:50:53
|
显示全部楼层
本帖最后由 sppz 于 2018-11-12 13:52 编辑
扩展一下,我们能得到参数,那么我们也能通过参数的数量得到不同的行为,请看如下代码
[mw_shl_code=c,true]
#define __pm_arguments_join_1(action, head, tail, \
argument0) (head##argument0##tail)
#define __pm_arguments_join_2(action, head, tail, \
argument0, argument1) ((head##argument0##tail) action (head##argument1##tail))
#define __pm_arguments_join_3(action, head, tail, \
argument0, argument1, argument2) ((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail))
#define __pm_arguments_join_4(action, head, tail, \
argument0, argument1, argument2, argument3) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail))
#define __pm_arguments_join_5(action, head, tail, \
argument0, argument1, argument2, argument3, \
argument4) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail) \
action (head##argument4##tail))
#define __pm_arguments_join_6(action, head, tail, \
argument0, argument1, argument2, argument3, argument4, argument5) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail) \
action (head##argument4##tail) action (head##argument5##tail))
#define __pm_arguments_join_7(action, head, tail, \
argument0, argument1, argument2, argument3, argument4, argument5, argument6) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail) \
action (head##argument4##tail) action (head##argument5##tail) action (head##argument6##tail))
#define __pm_arguments_join_8(action, head, tail, \
argument0, argument1, argument2, argument3, argument4, argument5, argument6, argument7) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail) \
action (head##argument4##tail) action (head##argument5##tail) action (head##argument6##tail) action (head##argument7##tail))
#define __pm_arguments_join_9(action, head, tail, \
argument0, argument1, argument2, argument3, argument4, argument5, argument6, argument7, \
argument8) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail) \
action (head##argument4##tail) action (head##argument5##tail) action (head##argument6##tail) action (head##argument7##tail) \
action (head##argument8##tail))
/*
...
...
由于字数限制,这里省去了一大段
*/
#define __pm_arguments_join_30(action, head, tail, \
argument0, argument1, argument2, argument3, argument4, argument5, argument6, argument7, \
argument8, argument9, argument10, argument11, argument12, argument13, argument14, argument15, \
argument16, argument17, argument18, argument19, argument20, argument21, argument22, argument23, \
argument24, argument25, argument26, argument27, argument28, argument29) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail) \
action (head##argument4##tail) action (head##argument5##tail) action (head##argument6##tail) action (head##argument7##tail) \
action (head##argument8##tail) action (head##argument9##tail) action (head##argument10##tail) action (head##argument11##tail) \
action (head##argument12##tail) action (head##argument13##tail) action (head##argument14##tail) action (head##argument15##tail) \
action (head##argument16##tail) action (head##argument17##tail) action (head##argument18##tail) action (head##argument19##tail) \
action (head##argument20##tail) action (head##argument21##tail) action (head##argument22##tail) action (head##argument23##tail) \
action (head##argument24##tail) action (head##argument25##tail) action (head##argument26##tail) action (head##argument27##tail) \
action (head##argument28##tail) action (head##argument29##tail))
#define __pm_arguments_join_31(action, head, tail, \
argument0, argument1, argument2, argument3, argument4, argument5, argument6, argument7, \
argument8, argument9, argument10, argument11, argument12, argument13, argument14, argument15, \
argument16, argument17, argument18, argument19, argument20, argument21, argument22, argument23, \
argument24, argument25, argument26, argument27, argument28, argument29, argument30) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail) \
action (head##argument4##tail) action (head##argument5##tail) action (head##argument6##tail) action (head##argument7##tail) \
action (head##argument8##tail) action (head##argument9##tail) action (head##argument10##tail) action (head##argument11##tail) \
action (head##argument12##tail) action (head##argument13##tail) action (head##argument14##tail) action (head##argument15##tail) \
action (head##argument16##tail) action (head##argument17##tail) action (head##argument18##tail) action (head##argument19##tail) \
action (head##argument20##tail) action (head##argument21##tail) action (head##argument22##tail) action (head##argument23##tail) \
action (head##argument24##tail) action (head##argument25##tail) action (head##argument26##tail) action (head##argument27##tail) \
action (head##argument28##tail) action (head##argument29##tail) action (head##argument30##tail))
#define __pm_arguments_join_32(action, head, tail, \
argument0, argument1, argument2, argument3, argument4, argument5, argument6, argument7, \
argument8, argument9, argument10, argument11, argument12, argument13, argument14, argument15, \
argument16, argument17, argument18, argument19, argument20, argument21, argument22, argument23, \
argument24, argument25, argument26, argument27, argument28, argument29, argument30, argument31) \
((head##argument0##tail) action (head##argument1##tail) action (head##argument2##tail) action (head##argument3##tail) \
action (head##argument4##tail) action (head##argument5##tail) action (head##argument6##tail) action (head##argument7##tail) \
action (head##argument8##tail) action (head##argument9##tail) action (head##argument10##tail) action (head##argument11##tail) \
action (head##argument12##tail) action (head##argument13##tail) action (head##argument14##tail) action (head##argument15##tail) \
action (head##argument16##tail) action (head##argument17##tail) action (head##argument18##tail) action (head##argument19##tail) \
action (head##argument20##tail) action (head##argument21##tail) action (head##argument22##tail) action (head##argument23##tail) \
action (head##argument24##tail) action (head##argument25##tail) action (head##argument26##tail) action (head##argument27##tail) \
action (head##argument28##tail) action (head##argument29##tail) action (head##argument30##tail) action (head##argument31##tail))
#define __pm_arguments_join(action, head, tail, ...) __pm_arguments_expand(__pm_arguments_map(action, __VA_ARGS__, \
__pm_arguments_join_32, __pm_arguments_join_31, __pm_arguments_join_30, __pm_arguments_join_29, \
__pm_arguments_join_28, __pm_arguments_join_27, __pm_arguments_join_26, __pm_arguments_join_25, \
__pm_arguments_join_24, __pm_arguments_join_23, __pm_arguments_join_22, __pm_arguments_join_21, \
__pm_arguments_join_20, __pm_arguments_join_19, __pm_arguments_join_18, __pm_arguments_join_17, \
__pm_arguments_join_16, __pm_arguments_join_15, __pm_arguments_join_14, __pm_arguments_join_13, \
__pm_arguments_join_12, __pm_arguments_join_11, __pm_arguments_join_10, __pm_arguments_join_9, \
__pm_arguments_join_8, __pm_arguments_join_7, __pm_arguments_join_6, __pm_arguments_join_5, \
__pm_arguments_join_4, __pm_arguments_join_3, __pm_arguments_join_2, __pm_arguments_join_1)(action, head, tail, __VA_ARGS__))
[/mw_shl_code]
以上一大段实现了用action拼接所有参数的作用(顺便在参数上加上前缀和后缀)
[mw_shl_code=c,true]
__pm_arguments_join(|, , , 1, 2, 3, 4); //相当于(1) | (2) | (3) | (4)
[/mw_shl_code]
|
|