为什么有人为第一个参数定义宏,包括C中的逗号?

igo*_*ack 5 c libev

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 */
Run Code Online (Sandbox Code Playgroud)

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

int  ev_run (EV_P_ int flags EV_CPP (= 0));
Run Code Online (Sandbox Code Playgroud)

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

int  ev_run (EV_P, int flags EV_CPP (= 0));
Run Code Online (Sandbox Code Playgroud)

这是C中的伎俩还是有其他原因?不熟悉C之前的Google,但仍然没有答案.

Pau*_*kin 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
Run Code Online (Sandbox Code Playgroud)

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

如果宏没有包含逗号,则无法删除第一个参数.