本文共 2869 字,大约阅读时间需要 9 分钟。
typedef unsigned char UINT8;typedef unsigned short UINT16;typedef unsigned int UINT32;typedef signed char INT8;typedef signed short INT16;typedef signed int INT32;typedef float FLOAT;typedef double DOUBLE;typedef char CHAR;
以结构体为例,下面我们定义一个名为 student的结构体:
typedef struct student{ //code}Stu_st,*Stu_pst;/*struct student stu1;和 Stu_st stu1;没有区别。struct student *stu2;和 Stu_pst stu2;和 Stu_st *stu2;没有区别。*/
我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型,即:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
甚至还可以在连 double 都不支持的平台三上,改为:
typedef float REAL;
这样,当跨平台移植程序时,我们只需要修改一下 typedef 的定义即可,而不用对其他源代码做任何修改。其实,标准库中广泛地使用了这个技巧,比如 size_t 在 VC++2010 的 crtdefs.h 文件中的定义如下所示:
#ifndef _SIZE_T_DEFINED#ifdef _WIN64typedef unsigned __int64 size_t;#elsetypedef _W64 unsigned int size_t;#endif#define _SIZE_T_DEFINED#endif
为指针定义简洁的名称
typedef char* PCHAR;PCHAR pa;
为函数指针定义简洁的名称
#includeint add(int a, int b) { return a + b; } typedef int (PTypeFun1)(int, int); // 声明一个函数类型 typedef int (*PTypeFun2)(int, int); // 声明一个函数指针类型 int (*padd)(int, int); // 传统形式,定义一个函数指针变量 int main() { PTypeFun1 *pTypeAdd1 = add; PTypeFun2 pTypeAdd2 = add; padd = add; printf("pTypeAdd1(1, 2) is %d \n", pTypeAdd1(1, 2)); printf("pTypeAdd2(1, 2) is %d \n", pTypeAdd2(1, 2)); printf(" padd(1, 2) is %d \n", padd(1, 2)); return 0; }
为复杂的变量声明定义简洁的名称
// PFun是我们创建的一个类型别名typedef int *(*PFun)(int,char*);// 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);PFun a[5];//a[5]为指向函数的指针数组,数组名为a,数组内存了5个指向函数的指针,这些函数有一个int型的参数和一个char*型的参数,函数的返回值也是一个指针
记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:
先定义:typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);
const PSTR” 是否相当于 “const char*” 呢?
答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换 const PSTR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char* const(一个指向char的常量指针)”。即它实际上相当于“char* const”,而不是“const char*(指向常量 char 的指针)”要想让 const PSTR相当于 const char* 也很容易,如下面的代码所示:typedef const char* PCHAR;int mystrcmp(PCHAR, PCHAR);
typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:
typedef static int INT2; //不可行//编译将失败,会提示“指定了一个以上的存储类”
在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种数据类型,但是我们使用define就不能保证了
#define PCHAR char*PCHAR p3,p4;//这里的 p4 不是指针,仅仅是一个 char 类型的字符
typedef char* pchar;pchar p1,p2;//这里的 p1,p2 都是指针
转载地址:http://ydnii.baihongyu.com/