最后有额外参数的宏?

时间:2015-10-19 17:04:04

标签: c macros

我不确定该怎么称呼它。但是,这是我第三次在C宏中看到这种现象。

#define sigemptyset(what)   (*(what) = 0, 0)
                                         ^
                                         eh?  why not just ((*what) = 0)

是否有额外的零点?根据我的理解(例如,1,0,0,0),它只会评估为1(第一个条目)。

1 个答案:

答案 0 :(得分:4)

逗号运算符产生其右操作数的值,而不是左操作数。

更新:正如评论中@Kninnug指出的那样,sigemptyset是指定为返回int的POSIX函数(规范:here })。通过使用(*(what) = 0, 0),即使int属于*(what)以外的其他类型,它也可以保证宏产生intsigemptyset参数的类型应为sigset_t 1}})。

你的宏定义让我想到两件事: 如果它有(void *) 0作为右,操作数,它可以模仿返回空指针的函数:

#define sigemptyset(what)   (*(what) = 0, (void *) 0)

int *p = sigemptyset(q);

如果所有其他sig函数都应返回指针,则会很有用。

我想到的第二件事是通过在需要时通过0调用更改printf来允许调试:

 #define sigemptyset(what)   (*(what) = 0, printf("sigemptyset\n"))