C中return语句中第二个值的含义是什么?

AaA*_*AaA 5 c

我有以下c代码:

#define ASSERT_ACTIVE(active) do { if (!active) return errno = 6, -1; } while (0);
#define errno (*_errno())

int someCrazyFunc (bool active) {
    ASSERT_INACTIVE (active);
    ...
}
Run Code Online (Sandbox Code Playgroud)

据我所知,#define只需将替换文本放在指定标识符的位置即可.

我想知道:

  • 什么return errno = 6, -1;意思?是在一个return语句中返回两个值?
  • 替换代码是什么意思 (*_errno()) = 6

caf*_*caf 9

没有第二个值 - return语句只返回一个值.在声明中:

return errno = 6, -1;
Run Code Online (Sandbox Code Playgroud)

返回值是表达式的结果errno = 6, -1.这是使用逗号运算符的表达式-它被解析为(errno = 6), -1,其计算结果为-1并分配6errno作为副作用.所以这意味着它等同于两个语句:

errno = 6;
return -1;
Run Code Online (Sandbox Code Playgroud)

假设这_errno()是一个返回指针的函数 - 例如它的返回类型为int *- 那么表达式(*_errno()) = 6将值赋给6函数返回值指向的对象.它相当于类似的代码:

int *p = _errno();
*p = 6;
Run Code Online (Sandbox Code Playgroud)

errno通常这样定义,以便为多线程实现中的每个线程提供自己的errno._errno()在这种情况下,函数将返回指向当前线程errno变量的指针.