您的位置:首页 > 编程语言 > C语言/C++

gcc中C语言扩展

2016-05-09 17:35 351 查看

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;
注意最后一句"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之前执行

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: