我不完全确定这是什么标题。但是,这是我第三次在C宏中看到这种现象。结尾带有额外参数的宏?
#define sigemptyset(what) (*(what) = 0, 0)
^
eh? why not just ((*what) = 0)
是否有一个额外的零点?例如,以我的理解(1,0,0,0)来评价为1(第一项)。
我不完全确定这是什么标题。但是,这是我第三次在C宏中看到这种现象。结尾带有额外参数的宏?
#define sigemptyset(what) (*(what) = 0, 0)
^
eh? why not just ((*what) = 0)
是否有一个额外的零点?例如,以我的理解(1,0,0,0)来评价为1(第一项)。
逗号运算符产生其右操作数的值,而不是左操作数。
UPDATE:如在评论中指出由@Kninnug,sigemptyset
是指定为返回一个int
(规格:here)一POSIX功能。通过使用(*(what) = 0, 0)
它保证宏产生一个int
,即使*(what)
是另一种类型比int
(sigemptyset
参数应为sigset_t
类型)。
两件事情,我想起你的宏定义: 如果有(void *) 0
为右,
操作数,它可以模仿,它返回一个空指针的函数:
#define sigemptyset(what) (*(what) = 0, (void *) 0)
int *p = sigemptyset(q);
这可能是有用的如果你所有的其他sig
函数都应该返回指针。
这使我想到的第二件事情是需要的时候用printf
呼叫改变0
允许调试:
#define sigemptyset(what) (*(what) = 0, printf("sigemptyset\n"))
OP(可能)指的是POSIX定义['sigemptyset']的实现(http://pubs.opengroup.org/onlinepubs/ 007908775/xsh/sigemptyset.html)操作,它必须返回一个(n'int')0.因此第二个表达式。 – Kninnug
@Kninnug好点,我正在添加一个编辑。 – ouah
如果你想把东西划掉,也许你应该删除它们... – skrrgwasme
这是周围的其他方法。逗号运算符评估为_last_参数。在这种情况下为零,表示无论输入成功。 – doynax
@doynax不完全:逗号运算符*计算所有操作数(子表达式),但结果是最后一个子表达式的结果。 – Kninnug
我讨厌逗号运算符,这再一次愚弄了我,所以这是upvote的借口。我试图找到一个upvote每天来平衡许多downvotes :) –