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之前执行
相关文章推荐
- HDU 2147-kiki's game(博弈/找规律)
- 【C语言】求二维数组最大值最小值平均值
- Google C++ Style Guide----英文版
- C++ 基础
- 简单总结C++中的修饰符类型
- [C++]高精度 bign (重载运算符版本)
- C++学习曲线
- c++函数模板
- Caffe图片特征提取(Python/C++)
- C++中的运算符和运算符优先级总结
- 转 C++STL之string
- c++模板类成员的声明和定义
- 【C语言】矩阵转置
- Dual Palindromes
- 如何在Visual Studio和CodeBlocks中反编译C++代码
- 冒泡排序C++实现
- C语言的组成:32个关键词、9种控制语句、34种运算符
- 解析C++中的5个存储类的作用
- C++文件读写
- C#和C++除了语法上的差别外,还有什么其他的区别