gcc中C语言扩展

本文探讨了C++中的内联表达式及其在不同场景下的应用,包括宏定义的安全使用、临时变量的作用域和生命周期,以及表达式语句的执行顺序等关键问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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之前执行







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值