声明新的类型名来代替原有的类型名
比如,typedef int INTERGER; 或 typedef float REAL;
相当于用INTERGER来代表int类型,用REAL来代表float
习惯上把用typedef声明的类型用大写字母表示
在C++中typedef是用以给数据类型取别名(当然还有其他作用)
谭浩强那本《C语言程序设计》中关于用typedef声明一个新类型的步骤是这么说的:
1、先按定义变量的方法写出定义体(如:int i;)
2、将变量名换成新类型名(如:将i换成COUNT)
3、在最前面加typedef(如:typedef int COUNT)
4、然后可以用新类型名去定义变量
除了最后一步,从第三步倒着来看:
将最前名的typedef去掉,就变成了第二步
即去掉typedef后是一个定义体,只不过把一般定义体的变量名换成了新类型名(第一步与第二步的变化)。
所以只要看这个定义体中变量名位置上的名字,就知道新类型的名字,也容易看出是定义什么类型。
1、去掉typedef后变为:
int (WINAPI *PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT uType);
这是声明一个函数指针,变量名为PFNMESSAGEBOX(即新类型名)
2、去掉typedef后变为:
string array[10];
这应该是定义一个string类型的数组,变量名为array(即新类型名)
类型定义,给一种类型取个别名,可以使程序的可读性,移植性和通用性更好,相比C++在C中用的多点。
比如我有个数据结构(简单看一下):
typedef int ListElem; //定义链表中的元素类型
typedef struct listnode {
ListElem elem; //节点中存储的元素
struct listnode* next;
} ListNode; //定义链表的节点,定义结构体类型
int appendElem(LinkList* l, ListElem* elem) //操作链表的方法
{
l->tail->next = createNode(elem, NULL);
l->tail = l->tail->next;
l->size++;
return 1;
}
如果现在我想重用这个数据结构来存储一个复杂一点的信息,如学生信息,那么就可以用typedef把存储的元素重新定义一下,程序基本不用怎么改,要不然许多函数都要更改,工作量大也容易出错。C++中有模版,一般不用这样做。
typedef struct {long num;char name[32];float score;} ListElem;
另外typedef还常用来定义函数指针类型,定义的方式如下:
typedef return_type (*FUN_PTR)(parameters);
最后,typedef还可以用来定义成员类型,通常是类模版的traits用的。
相当于给一个原有的类型名取一个新名字,以后两者表示同一个类型,可以互换使用。
如:typedef int INTERGER
有了这个定义,以后就可以用诸如“INTERGER a”、“INTERGER b = 5”一类的句子来定义一个整型变量了。
typedef,就是为某一种数据类型定义一个别名,使程序员的意图显而易见;