Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结尾有额外参数的宏?_C_Macros - Fatal编程技术网

C 结尾有额外参数的宏?

C 结尾有额外参数的宏?,c,macros,C,Macros,我不太清楚这个标题是什么。但是,这是我第三次在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(第一个条目)。

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

更新:正如注释中指出的,
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函数。你提到了我困惑的部分。它保证返回函数的类型正确(当返回类型不一定重要时)。