首页 > 解决方案 > 为什么有人会为第一个参数定义宏,包括 C 中的逗号?

问题描述

ev.hlibev 内部,我发现了一些看起来很奇怪无法理解的宏:

173 # define EV_P  struct ev_loop *loop /* a loop as sole parameter in a declaration */
174 # define EV_P_ EV_P,                /* a loop as first of multiple parameters */

作者将宏定义EV_P_EV_P,并将其用作函数定义中的第一个参数,如下所示:

int  ev_run (EV_P_ int flags EV_CPP (= 0));

很好奇为什么不直接写EV_P,而不是EV_P_,所以函数参数用逗号看起来会更清楚:

int  ev_run (EV_P, int flags EV_CPP (= 0));

这是C中的一个技巧还是有其他原因?不熟悉C,之前google了一下,还是没有答案。

标签: clibev

解决方案


如果您查看更多代码,您就会明白为什么。

#if EV_MULTIPLICITY
struct ev_loop;
# define EV_P  struct ev_loop *loop
# define EV_P_ EV_P,
...
#else
# define EV_P void
# define EV_P_
...
#endif

如果EV_MULTIPLICITY定义为非零,那么您将获得一个额外的参数来调用EV_P_在参数列表开头包含宏的调用。如果不是,那么你没有。

如果宏不包含逗号,则无法删除第一个参数。


推荐阅读