C 结尾有额外参数的宏?
我不太清楚这个标题是什么。但是,这是我第三次在C宏中看到这种现象C 结尾有额外参数的宏?,c,macros,C,Macros,我不太清楚这个标题是什么。但是,这是我第三次在C宏中看到这种现象 #define sigemptyset(what) (*(what) = 0, 0) ^ eh? why not just ((*what) = 0) 这个额外的零有意义吗?以我的理解(1,0,0,0)为例,它只计算为1(第一个条目)。逗号运算符生成其右操作数的
#define sigemptyset(what) (*(what) = 0, 0)
^
eh? why not just ((*what) = 0)
这个额外的零有意义吗?以我的理解(1,0,0,0)为例,它只计算为1(第一个条目)。逗号运算符生成其右操作数的值,而不是左操作数的值 更新:正如注释中指出的,
sigeptypyset
是一个POSIX函数,指定返回int
(规范:)。通过使用(*(what)=0,0)
它可以保证宏生成int
,即使*(what)
是int
以外的另一种类型(sigeptyset
参数的类型应该是sigset
)
我想到你的宏观定义有两件事:
如果它将(void*)0
作为右侧的,
操作数,则它可以模拟返回空指针的函数:
#define sigemptyset(what) (*(what) = 0, (void *) 0)
int *p = sigemptyset(q);
如果您的所有其他sig
函数都应该返回指针,那么它将非常有用
我想到的第二件事是允许调试,在需要时通过printf
调用更改0
:
#define sigemptyset(what) (*(what) = 0, printf("sigemptyset\n"))
相反。逗号运算符的计算结果为最后一个参数。在本例中为零,表示无论输入如何都成功。@doynax不完全正确:逗号运算符对所有操作数(子表达式)求值,但结果是最后一个子表达式的结果。我讨厌逗号运算符,这再次愚弄了我,所以这是向上投票的借口。我试图每天找到一个向上投票来平衡许多向下投票:)OP(可能)是指POSIX定义的操作的实现,它必须返回一个(n
int
)0。因此出现了第二个表达式。对不起,我不是想重点讨论POSIX函数。你提到了我困惑的部分。它保证返回函数的类型正确(当返回类型不一定重要时)。