C/C++学习笔记(九)typedef的使用

来源:互联网 发布:360软件管理 编辑:程序博客网 时间:2024/05/20 10:20

typedef用来为声明定义简单的别名,与宏定义有些差异。它本身是一种存储类的关键字,与autoexternmutablestaticregister等关键字不能出现在同一个表达式中,例如typedef static int INT2; 并不可行。


typedef可以定义一种类型的别名

typedef可以定义一种类型的别名,声明的别名一般用大写的英文字符,下面是一个实例:

#include "stdafx.h"#include <iostream>using namespace std;typedef long double REAL; typedef char* PCHAR; // 一般用大写#define DPCHAR char *int _tmain(int argc, _TCHAR* argv[]) {REAL a=1;PCHAR cp;PCHAR cp1,cp11;//此行等于char * cp1;char * cp11;DPCHAR cp2,cp22;//此行等于char * cp2,cp22char c='c';char cs[2]={'x','y'};cp=&c;cp1=cs;cp11=cs;cp2=cs;//cp22=&c;//此处报错,cp22不是字符指针//cp22=cs;//此处报错,cp22不是字符数组指针cout<<"a="<<a<<endl;cout<<"cp->"<<*cp<<endl;cout<<"cs->"<<cs[1]<<endl;cout<<"cp1->"<<cp1[1]<<endl;cout<<"cp11->"<<cp11[1]<<endl;cout<<"cp2->"<<cp2[1]<<endl;getchar();return 0;  }

运行结果:



这个实例给我们两个启发:

1、typedef不只是简单的宏替换,PCHAR和DPCHAR的效果是不一样的,PCHAR必须从实际意义上来使用,即它是个字符或者字符数的指针类型;DPCHAR则不需用这么考虑,他只是字符直接替换而已。

2、REAL可以是与平台无关的类型,在不支持 long double的平台二上,改为:typedef double REAL; 在连 double都不支持的平台三上,改为:typedef float REAL; 也就是说,当跨平台时,只要改下typedef本身就行,不用对其他源码做任何修改。


为复杂的声明定义一个新的简单的别名

对于以下两个声明:

int *(*aa[5])(int, char*);void (*bb[10]) (void (*)());
如果有多个同样的声明无疑是一种麻烦的事情,typedef可以为复杂的声明定义一个新的简单的别名,这样就省事多了:

typedef int *(*pFun)(int, char*); typedef void (*pFunParam)();typedef void (*pFunx)(pFunParam);
这样就可以用别名来声明aa和bb了:

pFun aa[5];pFunx bb[10];


帮助struct声明新对象

typedef用在旧的C的代码中,帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名对象名,如:

struct tagPOINT1{int x;int y;};struct tagPOINT1 p1;
我们可以用typedef给tagPOINT1起个别名,然后就不用再在声明时候加个struct了:

typedef struct tagPOINT1{int x;int y;} * TAGSTRUCT;TAGSTRUCT p1;


这种情况只在老的c语言中有用,现在已经没有意义了,估计是有人给优化了,所以现在既不用struct也不用typedef了:

struct tagPOINT1{int x;int y;};tagPOINT1 p1;







原创粉丝点击