分类: LINUX
2011-05-27 18:47:37
在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;
是非法的。