最后带有额外参数的宏?

Macros with extra parameter at the end?

我不太确定该用什么标题。但是,这是我第三次在 C 宏中看到这种现象。

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

那个额外的零有什么意义吗?例如,据我了解 (1, 0, 0, 0) 只会评估为 1(第一个条目)。

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

更新: 正如 @Kninnug in the comments, sigemptyset is a POSIX function specified to return an int (specifications: here 指出的那样)。通过使用 (*(what) = 0, 0) 它保证宏产生 int 即使 *(what) 是不同于 int 的另一种类型(sigemptyset 参数应该是类型 sigset_t).

你的宏定义让我想到两件事: 如果它有 (void *) 0 作为正确的 , 操作数,它可以模仿一个 return 是空指针的函数:

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

int *p = sigemptyset(q);

如果所有其他 sig 函数都应该 return 指针,它会很有用。

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

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