【程序设计】typedef用法总结

来源:互联网 发布:iphone与mac蓝牙连接 编辑:程序博客网 时间:2024/06/05 16:39

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 原创编写,部分资料参考网络及课本,转载注明出处。

谢谢!


0 0
原创粉丝点击