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

Why would someone define macros for first parameter including comma in C?

在libev的ev.h里面,我发现了一些看起来很奇怪的宏,看不懂:

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以前也没有答案

如果你多看 the code,你就会明白为什么了。

#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_ 宏的调用。如果不是,那你就不会。

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

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

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