some times,你需要用双括号来括住一堆复合语句,看起来怪怪的,但在某些场合你还真只能这么干!
拓展:
以下的东东被称为“复合语句表达式”:
({
int y = foo();
int z;
if(y > 0) z = y;
else z = -y;
z;
})
first of all,我们先得罗列一下语法点:
1,一对圆括号在外边,一对大括号在里面。
2,复合语句可以有函数调用、变量赋值甚至是控制流代码块。
3,最后一条语句必须以分号结尾。
4,最后一条语句的值,将作为整个语句表达式的值。
secondly,那它有什么用呢?复杂宏。
有时候一条宏语句很长,而且还需要进行赋值运算,那就要用复合语句表达式了。
例如:
#define MAX(a,b) \
({ \
typeof(a) _a = (a); \
typeof(b) _b = (b); \
(void)(&_a == &_b); \
_a>_b ? _a : _b;\
})
int x=1, y=2, m;
m = MAX(x, y);
thirdly,使用复合语句表达式的宏跟普通函数有什么区别?
复合语句表达式中定义的任何临时变量在其所在语句结束时被释放,而函数总定义的任何临时变量在函数return的时候被释放。
例如:
#define macro(a) \
({typeof(a) b=(a); b+3;})
template<typename T> T fun(T a)
{
T b=a;
return b+3;
}
然后调用如下函数:
void foo()
{
macro(X());
fun(X());
}
此时带参宏跟函数是有些微妙的差异的:宏中的X将在初始化完a之后立即被释放,而函数中的X将在整个函数return之后被释放。