5

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了一下,还是没有答案。

4

2 回答 2

7

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

#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_在参数列表开头包含宏的调用。如果不是,那么你没有。

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

于 2018-06-10T11:27:19.310 回答
2

这样做的一个原因是让您使用预处理器编译出第一个参数。

想象一下这样一种情况,当您的代码应该针对以库X定义函数struct ev_loop *loop作为其第一个参数的函数进行编译时,或者另一个Y具有不这样做的函数的库。EV_P_在这种情况下,您可以为包含库的逗号定义一个宏X,或者在编译代码以针对库运行时有条件地将其定义为空字符串Y

于 2018-06-10T11:29:59.763 回答