您的位置:首页 > 其它

【程序设计】typedef用法总结

2014-04-30 01:26 253 查看
typedef一共有以下几种用法:

1.定义一个类型的新名字。

很多人自然而然的会联想到define,就在这里一块说说typedef的类型重命名与define的类型重命名的区别。

当我们在程序中敲入以下代码时实现的是什么功能:

char *a,b;

有时候我们可能希望通过上面代码实现(情况1):

char *a;

char *b;

但不如愿的是上面的代码实际上实现的是(情况2):

char *a;

char b;//b是一个char类型,不是char指针类型

但是,当我们使用了

typedef char* Pchar;

Pchar a,b;

此时我们实现的,正是上面情况1的情况.因为typedef是有类型识别的,他已经认定了Pchar是char*类型的了;

但当我们使用了

#define Pchar char*;

Pchar a,b;

此时实现的,正是char* a,b;所实现的功能(情况2),原因很简单,#define是编译前的预处理操作,直接将代码里的所有Pchar 字符段转换为 char*,这也就不难理解为什么跟char* a,b;一个情况了.

再看另外一个例子:

typedef char * pStr;

char string[4] = "abc";

const char *p1 = string;

const pStr p2 = string;

p1++;

p2++;

上图的代码执行到p2++的时候发生错误。

因为在const char *p1中,const限制的是p1所指向的内容不可改变。即const限制了*p1;

但是const pStr p2中,const限制的是p2本身的内容不可改变。不管你是什么类型的,const只看到一个变量p2;

用typedef来定义与平台无关的类型。

比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

typedef long double REAL;

在不支持 long double 的平台二上,改为:

typedef double REAL;

在连 double 都不支持的平台三上,改为:

typedef float REAL;

这样,当我们跨平台修改代码时,只需要改下 typedef 本身就行,不用对其他源码做任何修改。

这大大提高了我们代码的可重用性



3.用来定义一个通用的函数(指针)类



#include<stdio.h>

typedef void (A)(void); //定义了一个返回值为void,变量也为void的所有函数的一个类
typedef void (*pA)(void);//定义了一个返回值为void,变量也为void的所有函数的一个类指针

void f1()
{
printf("f1\n");
}

void f2()
{
printf("f2\n");
};

int main()
{
A *a;//定义一个指向A类型的指针,其实a就是pA类的一个实例
pA pa;//定义一个指向A类型的指针
a = f1;
pa = f1;//可以把f1默认为A*或pA类型的一个实例,所以当f1赋值给a、pa的时候都是直接赋值
a();
pa();
a = f2;
pa = f2;
a();
pa();
return 0;
}


上面的代码演示的输出如下:

f1

f1

f2

f2

可见,无论是定义一个函数类或者函数类指针,他所实现的结果是一样的。具体可见注释。

本人由Cout_Sev 原创编写,部分资料参考网络及课本,转载注明出处。

谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  typedef