以下代码片段来自 mac sdk signal.h
:
#define sigemptyset(set) (*(set) = 0, 0)
只是想知道 , 0)
是什么意思做什么?
最佳答案
宏扩展为逗号表达式:首先计算左操作数,设置 set
指向的对象。至0
,然后计算右操作数,其值是整个表达式的值,因此: 0
.
换句话来说,宏的行为就像一个总是成功的函数,成功由返回值 0
指示。 .
除了类型检查之外,该宏相当于:
#include <signal.h>
int sigemptyset(sigset_t *set) {
*set = 0;
return 0;
}
请注意 <signal.h>
头文件还包含此函数的原型(prototype):
int sigemptyset(sigset_t *);
在您的代码中,调用 sigemptyset(&sigset)
调用宏,但您可以通过编写 (sigemptyset)(&sigset)
强制引用库函数或者通过获取指向该函数的指针。该宏允许内联扩展而无需更改原型(prototype)。 clang 可以在链接时对小函数执行内联扩展,但不能对动态库内定义的函数执行内联扩展。
同样的技巧也适用于头文件中的其他函数,其中, 0)
表达式必须计算为 0
类型 int
:
#define sigaddset(set, signo) (*(set) |= __sigbits(signo), 0)
#define sigdelset(set, signo) (*(set) &= ~__sigbits(signo), 0)
#define sigemptyset(set) (*(set) = 0, 0)
#define sigfillset(set) (*(set) = ~(sigset_t)0, 0)
关于c - 下面的c定义的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75437469/