Reputation: 3694
I have following c code:
#define ASSERT_ACTIVE(active) do { if (!active) return errno = 6, -1; } while (0);
#define errno (*_errno())
int someCrazyFunc (bool active) {
ASSERT_INACTIVE (active);
...
}
As far as I know a #define
will simply place replacement text in place of the specified identifier.
I like to know:
return errno = 6, -1;
means? is that returns two values in one return statement?(*_errno()) = 6
Upvotes: 5
Views: 265
Reputation: 239041
There isn't a second value - a return
statement returns exactly one value. In the statement:
return errno = 6, -1;
The return value is the result of the expression errno = 6, -1
. This is an expression using the comma operator - it is parsed as (errno = 6), -1
, which evaluates to -1
and assigns 6
to errno
as a side-effect. So this means that it's equivalent to the two statements:
errno = 6;
return -1;
Assuming that _errno()
is a function returning a pointer - for example it has a return type of int *
- then the expression (*_errno()) = 6
assigns the value 6
to the object pointed to by the return value of the function. It would be equivalent to code similar to:
int *p = _errno();
*p = 6;
errno
is often defined like this in order to give each thread in a multi-threaded implementation its own errno
. The function _errno()
in this case would return a pointer to the current thread's errno
variable.
Upvotes: 9
Reputation: 409176
That is not actually a second value to the return
statement, it's the comma operator. What it does is to evaluate the expressions on both sides of the comma, but "return" only the value of the second expression.
So what return errno = 6, -1;
does is evaluate the expressions errno = 6
and -1
separately and then give back the result of the second expression -1
, which will then be used by return
.
Upvotes: 1