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

时间:2018-06-10 11:19:58

标签: c libev

在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,谷歌,但仍然没有答案。

2 个答案:

答案 0 :(得分:7)

如果你看一下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_宏的调用会获得额外的参数。如果不是,那么你就不会。

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

答案 1 :(得分:2)

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

想象一下这样一种情况:应该针对库void myclass::myfunc(context& ctx) { @autoreleasepool { std::string path = ctx.getData().path; NSString *nsPath = [NSString stringWithUTF8String:path.c_str()]; ... (do something with nsString, Should it be released after leaving the scope ?) } } 编译代码来定义以X作为其第一个参数的函数,或者另一个库struct ev_loop *loop具有不执行此操作的函数。在这种情况下,您可以为Y定义一个宏,其中包含库EV_P_的逗号,或者在编译要对库X运行的代码时有条件地将其定义为空字符串。< / p>