# 1.基础介绍
typedef是C/C++语言中保留的关键字,用来定义一种数据类型的别名。
typedef并没有创建新的类型,只是指定了一个类型的别名而已。
typedef定义的类型的作用域只在该语句的作用域之内, 也就是说如果typedef定义在一个函数体内,那么它的作用域就是这个函数。如果typedef定义在一个命名空间中,则其作用域只在当前命名空间中。
使用 typedef 关键字可以用来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。
# 2.typedef 的常用的几种情况
- 给基本数据类型定义别名
// 1
typedef doule REAL;
// 2
typedef float REAL;
定义数据类型REAL
,在不同平台上通用的代码,如需改动,只需要修改typedef
语句即可。
- 为复杂类型定义别名,简化代码
typedef int *(*pFun)(int, int); // 定义函数指针
int *add(int x, int y)
{
int *p = new int;
*p = x + y;
return p;
}
pFun fp[1]; // 定义函数指针数组
fp[0] = add;
std::cout << "r " << *fp[0](1,2) << std::endl;
- typedef 与struct/enum/union等自定义数据类型共同使用
在C
语言中,对标签标识符强制了自己单独的命名空间,如自定义结构体时
struct Point {
int x;
int y;
};
// 使用
struct Point p;
因在C语言中,Point
定义在了struct
命名空间中,使用时必须写成struct Point p
,比较麻烦, 因此通常使用typedef
给其起别名。
typedef struct Point_ {
int x;
int y;
Point_(int a, int b) : x(a), y(b) {};
} Point;
// 使用
Point p;
在C++中已经不是必须的了,struct
定义的类型,可直接通过类型名使用。
# 3.使用typedef可能出现的问题
- 1.歧义
typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);
在这里,const PCHAR
与const char*
不同,const PCHAR
中指针是常量,const char*
中,char是常量
// constant pointer to constant char
const char * const
// constant pointer to char
char * const
// pointer to constant char
const char *
- 重复的存储类关键字
虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:
typedef static int INT_STATIC;
上面,static
与typedef
关键字重复了。
# 参考资料
- 1.https://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c (opens new window)
- 2.https://www.tutorialspoint.com/difference-between-const-char-p-char-const-p-and-const-char-const-p-in-c#:~:text=char*%20const%20says%20that%20the,cannot%20point%20to%20another%20char. (opens new window)
- 3.http://c.biancheng.net/view/298.html (opens new window)