下面的c define的语法是什么?[duplicate]

ryhaxcpt  于 2023-02-15  发布在  其他
关注(0)|答案(2)|浏览(104)
    • 此问题在此处已有答案**:

What does the comma operator , do?(8个答案)
昨天关门了。
以下代码片段来自mac sdk signal.h

#define sigemptyset(set)    (*(set) = 0, 0)

只是想知道, 0)是做什么的?

txu3uszq

txu3uszq1#

宏扩展为逗号表达式:首先计算左操作数,将set指向的对象设置为0,然后计算右操作数,其值为整个表达式的值,因此:0.
换句话说,宏的行为类似于始终成功的函数,成功由返回值0指示。
除了类型检查外,宏等效于:

#include <signal.h>

int sigemptyset(sigset_t *set) {
    *set = 0;
    return 0;
}

注意,<signal.h>头文件还包含此函数的原型:

int sigemptyset(sigset_t *);

在你的代码中,sigemptyset(&sigset)调用宏,但是你可以通过写(sigemptyset)(&sigset)或者通过获取函数的指针来强制引用库函数。宏允许内联扩展而不改变原型。clang可以在链接时对小函数执行内联扩展,但是不能对动态库中定义的函数执行内联扩展。
头文件中的其他函数也使用相同的技巧,对于这些函数,, 0)对于表达式计算为int类型的0是必需的:

#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)
blmhpbnm

blmhpbnm2#

在此表达式中

(*(set) = 0, 0)

使用逗号运算符。
表达式的结果为0。
作为副作用,指针set所指向的对象被设置为0。
来自C标准(6.5.17逗号运算符)
2逗号运算符的左操作数作为void表达式计算;在它的求值和右操作数的求值之间有一个序列点,则右操作数求值;结果具有其类型和值。

相关问题