5

我有以下c代码:

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

int someCrazyFunc (bool active) {
    ASSERT_INACTIVE (active);
    ...
}

据我所知,a#define将简单地放置替换文本来代替指定的标识符。

我想知道:

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

2 回答 2

9

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

return errno = 6, -1;

返回值是表达式的结果errno = 6, -1。这是一个使用逗号运算符的表达式 - 它被解析为(errno = 6), -1,它的计算结果-1和赋值6errno副作用。所以这意味着它相当于两个语句:

errno = 6;
return -1;

假设这_errno()是一个返回指针的函数 - 例如它的返回类型为int *- 然后表达式(*_errno()) = 6将值分配给6函数返回值所指向的对象。它相当于类似于以下的代码:

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

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

于 2012-10-24T02:15:31.867 回答
1

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

所以要做return errno = 6, -1;的是分别评估表达式errno = 6-1然后返回第二个表达式的结果,-1然后由return.

于 2012-10-24T02:15:02.990 回答