我有以下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
答案 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}}。