https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Statement-Exprs.html#Statement-Exprs
1.
({ i nt y = foo (); int z;
if (y > 0) z = y;
else z = - y;
z; })
注意最后一句"z; ",没有它就没有返回值;
2.
#define max(a,b) ((a) > (b) ? (a) : (b))
不安全,因为宏计算两次a的值,或者b的值,如果有操作有副作用的话,就会出错;
比如:
max(a++,b)
a会加一还是加二?不确定
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
上面的代码是最稳的做法注:嵌入式的声明语句不能用在常量中,比如静态变量,位域,枚举值;
3.
#define macro(a) ({__typeof__(a) b = (a); b + 3; })
template<typename T> T function(T a) { T b = a; return b + 3; }
void foo ()
{
macro (X ());
function (X ());
}
在g++中,嵌入式的声明表达式macro(a)里传入的临时变量会在用完之后就释放,而函数的传入的变量,在调用函数function(a)的语句块结束后才会释放,这是函数和宏函数的一点小区别;
4.
A a;
({a;}).Foo ();
该代码运行后,({ a;}).Foo()输出this指针和a的地址不一样;
测试代码:
#include<iostream>
#include<cstdio>
using namespace std;
class A{
public:
void Foo();
};
void A::Foo(){
cout<<this<<endl;
}
int main(){
A a;
cout<<&a<<endl;
({a;}).Foo();
cout<<&a<<endl;
}
输出:0x7ffd08981bde
0x7ffd08981bdf
0x7ffd08981bde
5.
foo (), (({ bar1 (); goto a; 0; }) + bar2 ()), baz();
执行顺序foo()执行后,不会执行baz(),但是会执行bar1(),而bar2()不一定执行;如果bar2()执行了,那么会在foo之后,bar1之前执行