概念
C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等
typedef的2种用法
1) 为基本数据类型定义新的类型名
系统默认的所有基本类型都可以利用 typedef 关键字来重新定义类型名
代码如下所示:
typedef unsigned int COUNT
而且,我们还可以使用这种方法来定义与平台无关的类型。比如,要定义一个叫 REAL 的浮点类型,在目标平台上,让它表示最高精度的类型,即:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
甚至还可以在连 double 都不支持的平台上,改为:
typedef float REAL;
#ifndef _SIZE_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 size_t;
#else
typedef _W64 unsigned int size_t;
#endif
#define _SIZE_T_DEFINED
#endif
2) 为自定义数据类型(结构体、共用体和枚举类型,数组,指针)定义简洁的类型名称
结构体:
typedef struct tagPoint
{
double x;
double y;
double z;
} Point;
数组:
typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;
指针:
typedef char* PCHAR;
PCHAR pa;
使用 typedef 带来的陷阱
typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);
>在上面的代码中,“const PCHAR” 是否相当于 “const char” 呢?
答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了指针常量“char const(一个指向char的常量指针)”。即它实际上相当于“char const”,而不是“const char(指向常量 char 的指针)
指针常量: char * const p 内容可变,地址不可变
常量指针 const char p 地址可变,内容不可变
指向常量的指针常量: const char* const p 地址不可变,内容不可变
虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的
typedef static int INT_STATIC;
不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2013 中的报错信息为“不能指定多个存储类”。