2015-10-19 71 views
2

我不完全确定这是什么标题。但是,这是我第三次在C宏中看到这种现象。结尾带有额外参数的宏?

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

是否有一个额外的零点?例如,以我的理解(1,0,0,0)来评价为1(第一项)。

+0

这是周围的其他方法。逗号运算符评估为_last_参数。在这种情况下为零,表示无论输入成功。 – doynax

+0

@doynax不完全:逗号运算符*计算所有操作数(子表达式),但结果是最后一个子表达式的结果。 – Kninnug

+0

我讨厌逗号运算符,这再一次愚弄了我,所以这是upvote的借口。我试图找到一个upvote每天来平衡许多downvotes :) –

回答

4

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

UPDATE:如在评论中指出由@Kninnugsigemptyset是指定为返回一个int(规格:here)一POSIX功能。通过使用(*(what) = 0, 0)它保证宏产生一个int,即使*(what)是另一种类型比intsigemptyset参数应为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")) 

+1

OP(可能)指的是POSIX定义['sigemptyset']的实现(http://pubs.opengroup.org/onlinepubs/ 007908775/xsh/sigemptyset.html)操作,它必须返回一个(n'int')0.因此第二个表达式。 – Kninnug

+0

@Kninnug好点,我正在添加一个编辑。 – ouah

+0

如果你想把东西划掉,也许你应该删除它们... – skrrgwasme