rpl_handler.h中有个钩子函数的宏定义(percona-server-5.7.21-21)
#define RUN_HOOK(group, hook, args) \
(group ##_delegate->is_empty() ? \
0 : group ##_delegate->hook args)
这个mysql监听线程,半同步复制插件都是通过这个钩子加进去的
第一眼看上去懵逼了,##_delegate是什么鬼,查看了c++宏定义语法才明白
“##” 在宏定义中的作用则是将宏定义的多个形参成一个实际参数名
例如 (void) RUN_HOOK(server_state, before_handle_connection, (NULL));
即可展开为
(server_state_delegate->is_empty() ? \
0 : server_state_delegate->before_handle_connection(NULL))
并且 server_state_delegate 是作为参数名存在的,也就是其表示实际的对象或指针,可以进行方法调用
网友评论