c - 下面的c定义的语法是什么?

标签 c macros comma-operator

以下代码片段来自 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/

相关文章:

function - 在语言层面, `ccall` 到底是什么?

C 宏 - 未在此范围错误中声明

javascript - javascript 三元运算符中逗号的正确使用

c - 成功调用 fseek() 函数会清除流的文件结束指示器

c - 一次读取一个二进制文件 1 个字节

c - 在编辑控件中设置滚动位置

c - 为什么 glClear 不清除我的屏幕?

c - 如何将 OpenMP 指令 (#pragmas) 包装为函数或类似函数的宏?

javascript - 逗号运算符什么时候有用?