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

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,cp22

	char 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;







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值