posts - 11,  comments - 0,  trackbacks - 0

在C语言中,经常有如下的用法:

typedef struct  tag
{
    ...
} MyType, *MyPtr;

一旦通过如上定以后,就可以用MyType来定义struct tag结构了。

以前我使用typedef的时候,是按照其字面意思理解的,所以进入了一个误区。比如说我想定义MyInt为int类型,我用的代码如下:

typedef MyInt int;

我把上述代码理解为:定义MyInt类型为int。一切好像都是顺其自然的事情,但编译的时候才知道错误。

其实,在C语言中声明变量的时候,有个存储类型指示符(storage-class-specifier),它包括我们熟悉的

extern
static
auto
register

在不指定存储类型指示符的时候,编译器会根据约定自动取缺省值。另外,存储类型指示符的位置也是任意的(但要求在变量名和指针*之前),也就是说以下几行代码是等价的:

static const int i;

const static int i;

int const static i;

const int static i;

根据C语言规范,在进行句法分析的时候,typedef和存储类型指示符是等价的!所以,我们把上述使用static的地方替换为typedef:

typedef const int i;

const typedef int i;

int const typedef i;

const int typedef i;

上述代码的语义是:将i定义为一个类型名,其等价的类型为const int。以后如果我们有i a;代码,就等价于const int a;

对于有指针的地方也是一样的,比如:

int const typedef *t;

那么代码

t p;

就相当于

int const *p;

另外,typedef不能和static等存储类型指示符同时使用,因为每个变量只能有一种存储类型,所以代码:

typedef static int i;

是非法的
本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2010/0514/22708.php

posted on 2010-08-30 15:52 果冻 阅读(287) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜