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

时间:2012-10-24 02:11:47

标签: 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);
    ...
}

据我所知,#define只会将替换文本放在指定标识符的位置。

我想知道:

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

2 个答案:

答案 0 :(得分:9)

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

return errno = 6, -1;

返回值是表达式errno = 6, -1的结果。这是一个使用逗号运算符的表达式 - 它被解析为(errno = 6), -1,其评估为-1并将6指定为errno作为副作用。所以这意味着它等同于两个陈述:

errno = 6;
return -1;

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

int *p = _errno();
*p = 6;

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

答案 1 :(得分:1)

这实际上不是return语句的第二个值,它是逗号运算符。它的作用是评估逗号两边的表达式,但只返回第二个表达式的值。

return errno = 6, -1;所做的是分别评估表达式errno = 6-1,然后返回第二个表达式-1的结果,然后由return使用{1}}。