c - 为什么有人会为第一个参数定义宏,包括 C 中的逗号?
问题描述
在ev.h
libev 内部,我发现了一些看起来很奇怪无法理解的宏:
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了一下,还是没有答案。
解决方案
如果您查看更多代码,您就会明白为什么。
#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_
在参数列表开头包含宏的调用。如果不是,那么你没有。
如果宏不包含逗号,则无法删除第一个参数。
推荐阅读
- python-3.x - 仅返回列表中的单个值
- python-3.x - 从头开始实现堆
- css - CSS网格中的1px间隙不一致
- javascript - 在 React 组件中使用绝对路径
- css - 多个兄弟姐妹,将一些放在同一行并填充额外空间
- python - Pylint 为“http.HTTPStatus”提供了误报 E1101“no-member”错误
- sql - 检查是否有任何数组元素以特定字符 postgres 开头
- android - 由于android中的字节大小不同,某些图像无法从firebase加载
- python - SQLite 从列列表中获取 TOTAL?
- python - 将列表附加到列表时出现意外输出