linux内核宏container_of前期准备之gcc扩展关键字typeof
2015-05-09 18:01
260 查看
typeof基本介绍
typeof(x)
这是它的使用方法,x可以是数据类型或者表达式。它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会解释。
当x是数据类型时,它和关键字typedef很相似,只不过typedef是要先定义再使用,而typeof则是可立即使用的,如下:
当x是表达式时:
typeof(foo()) d;这句并不会导致函数foo被调用,上面有讲到它的作用时期和sizeof一样,它仅仅是获得x的数据类型,比如对于sizeof:
在编译器将源码由高级语言转到汇编语言时,sizeof关键字就其到了作用。我们甚至可以认为有点类似宏替换(注意发生的阶段不同),相当于是:
这一切发生在汇编阶段,typeof也是类似的作用原理,这也就是为什么foo()为什么并没被调用的原因。
typeof使用需要注意的问题
1.typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。
我的个人理解是extern和static的限定只是影响至链接阶段,而const和volatile影响直至执行阶段。好像并不怎么合理,暂时就记录下来吧。
2.比较容易忽略的一点,通常:
为什么要用typeof,或者说typeof的使用带来了什么好处
回想我们交换2个变量的方法,最先想到的是利用第三个变量作为中间变量。
如果我要交换的是2个char型变量呢?那岂不是又要写一个函数,太麻烦了。那么强大的typeof来了
一个宏搞定所有基本类型数据交换,甚至是构造类型。妈妈再也不用担心我写到手抽筋了。
参考:
http://module77.is-programmer.com/posts/22102.html
http://gcc.gnu.org/onlinedocs/gcc/Typeof.html
typeof(x)
这是它的使用方法,x可以是数据类型或者表达式。它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会解释。
当x是数据类型时,它和关键字typedef很相似,只不过typedef是要先定义再使用,而typeof则是可立即使用的,如下:
typedef int INT; int main(int argc, const char *argv[]) { INT a; typeof(int) b; return 0; }
当x是表达式时:
//变量 int a; typeof(a)b; //数组 int c[10]; typeof(c) d;//相当于int d[10];因为c的类型是int *[10] //函数 int foo(void) { return 0; } typeof(foo) c;//foo函数指针类型 int (*)(void) typeof(foo()) d; //foo函数返回类型 int
typeof(foo()) d;这句并不会导致函数foo被调用,上面有讲到它的作用时期和sizeof一样,它仅仅是获得x的数据类型,比如对于sizeof:
int a[10]; char len; len = sizeof(a);
在编译器将源码由高级语言转到汇编语言时,sizeof关键字就其到了作用。我们甚至可以认为有点类似宏替换(注意发生的阶段不同),相当于是:
int a[10]; char len; len = 40;
这一切发生在汇编阶段,typeof也是类似的作用原理,这也就是为什么foo()为什么并没被调用的原因。
typeof使用需要注意的问题
1.typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。
static int a = 5; typeof(a)b; //编译没问题,等于int b; typeof(static int) b; //编译报错 const int a = 2; typeof(a)b = 5;//等同于 const int 5;
我的个人理解是extern和static的限定只是影响至链接阶段,而const和volatile影响直至执行阶段。好像并不怎么合理,暂时就记录下来吧。
2.比较容易忽略的一点,通常:
int *a,b; //原意是定义2个int *的变量a,b。初学者容易犯的错误 //实际要用 int *a, *b; //但是typeof关键字不是这样的 int *a; typeof(a)b,c; //它就是int *b, *c的意思,它不是简单的宏替换,特别要注意
为什么要用typeof,或者说typeof的使用带来了什么好处
回想我们交换2个变量的方法,最先想到的是利用第三个变量作为中间变量。
void swap(int a,int b) { int tmp; tmp = b; b = a; a = tmp; }
如果我要交换的是2个char型变量呢?那岂不是又要写一个函数,太麻烦了。那么强大的typeof来了
#define SWAP(a, b) {\ typeof(a) _t=a;\ a=b;\ b=_t;}
一个宏搞定所有基本类型数据交换,甚至是构造类型。妈妈再也不用担心我写到手抽筋了。
参考:
http://module77.is-programmer.com/posts/22102.html
http://gcc.gnu.org/onlinedocs/gcc/Typeof.html
相关文章推荐
- [gcc核心扩展]关于gcc中的typeof以及其他东东
- [gcc核心扩展]关于gcc中的typeof以及其他
- [gcc核心扩展]关于gcc中的typeof以及其他东东
- C扩展 typeof 关键字解释
- PHP扩展开发-01-前期准备
- C 扩展关键字 typeof 解析
- [gcc核心扩展]关于gcc中的typeof以及其他东东
- [gcc核心扩展]关于gcc中的typeof以及其他东东
- [李景山php] php扩展开发系列--环境准备及安装
- 百万级访问网站前期的技术准备(下)
- php扩展开发-准备工作
- 测试前期准备之综述篇
- Nginx安装的前期准备工作
- SQL性能优化前期准备-清除缓存、开启IO统计
- gcc核心扩展
- C++ : __attribute__关键字扩展
- 《自动化测试修炼宝典》-第二章节-测试自动化的前期准备