【问题标题】:Why would someone define macros for first parameter including comma in C?为什么有人会为第一个参数定义宏,包括 C 中的逗号?
【发布时间】:2018-06-10 20:09:23
【问题描述】:

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

【问题讨论】:

  • 如果EV_P_ 有条件地重新定义为nothing,则手动插入逗号的情况会破坏参数列表。它将扩展为int ev_run(, int flags EV_CPP(=0));,显然无法编译。
  • 可能是降低程序可读性的“技巧”。我建议直接编写 Type 而不是以可读性为代价“缩短”代码。

标签: c libev


【解决方案1】:

如果您查看更多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_ 宏的调用会得到一个额外的参数。如果不是,那么你没有。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2018-11-11
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 2020-10-12
      相关资源
      最近更新 更多