Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151941
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-08 20:15
文章分类
文章存档

2018年(1)

2016年(3)

2015年(4)

2014年(21)

我的朋友

分类: LINUX

2014-07-25 11:14:16

原文地址:typeof在linux中妙用 作者:迷墙人

今天偶然又看到了typeof这个东西,只知道它大概是返回变量的类型,后来上网查了下发现这个关键字在linux中用的非常多, 这里大概叙述了typeof是一个什么东西,怎么用,实际上可以用简单的话来重述。如果你对sizeof很熟悉的话,那么大可进行类 推,sizeof(exp.)返回的是exp.的数据类型大小,那么typeof(exp.)返回的就是exp.的数据类型。值得注意的是在上面的话里我 们可以看到,如果编译选项中指定了使用标准C,那么gcc的扩展使用可能会受到影响,不过在gcc编译条件下使用__typeof__依然可以正常工作, 这和使用asm是一样的。当然如果是在其他的编译器条件下,这样做也不行了,只能自定义一个macro去使用,也就是说跟gcc没啥关系了,你愿意把 typeof咋实现都可以。

 

下面写一个小程序示例一下:)

 

#include

 

typedef struct

{

int x;

char y;

}astruct, * pastrcut;

 

int main()

{

int sizem, sizew;

int x = 3;

typeof(&x) m;

sizem = sizeof(m);

*m = 5;

typeof(((astruct *)5)->y) w;

sizew = sizeof(w);

w = ”a”;

return 1;

}

 

首先看main函数里的m变量,这个变量的类型就是typeof(&x), 由于x是int型的(这里与x是否被赋值一点关系都没有)所以&x应该是int *类型,那么typeof(&x)返回的类型就是int*,所以m自然也就是个int*类型的。之后我们看w变量,其类型是 typeof(((astruct *)8)->y), 其中astruct是一个被定义的结构类型,其中的y元素是char*类型,那么((astruct *)8)->y是啥意思呢?在这里0并不是真正的变量,可以把它理解为一个替代使用的符号当然这个符号最好是一个数,其意思更可以理解为一个被赋值 了的变量,这个数可以不是0,3也可以8也可以,随便什么都可以。那么((astruct *)0)->y仅仅就是表示了y这个变量,所以typeof的结果就是y元素的类型,也就是char。

阅读(1861) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~