在 GNU C 中,复合语句可以像一个表达式一样使用,例如下面的代码:
int a = ({
int z;
int y = foo ();
if (y > 0)
z = y;
else
z = - y;
z;
});
再比如,内核中定义的各种get_xxx()宏:
#define get_current_user() \
({ \
struct user_struct *__u; \
const struct cred *__cred; \
__cred = current_cred(); \
__u = get_uid(__cred->user); \
__u; \
})
...
#define get_current_groups() \
({ \
struct group_info *__groups; \
const struct cred *__cred; \
__cred = current_cred(); \
__groups = get_group_info(__cred->group_info); \
__groups; \
})
该语法可以用来定义更加安全的宏,解决宏定义中表达式的多次求值问题,例如:
#define max(a,b) ((a) > (b) ? (a) : (b))
int a = 1, b = 2, c;
c = max(a++, b++);
此时 c 等于 3,而不是 b 原来的值 2,因为在上述三目运算中 b++ 被计算了两次,可以重新定义该宏来解决这个问题:
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
int a = 1, b = 2, c;
c = max(a++, b++);
此时,c 等于 2。