typedef是c语言中给类型赋别名的工具。且不同于#define的宏义,在预编译时工作。typedef在运行时工作。
typedef不能与auto、extern、mutable、static、register等关键字出现在同一个表达式中。
它有如下优点与用法:
1.按功用设计,方便理解代码。
typdef int size; // 定义
size getSize(); // 使用
2.简化代码,隐藏数组、指针和模板类
typdef char str[300]; // 定义
str s; // 等价于 char str[300];
typedef char* ptr; // 定义
ptr a; // 等于 char* a;
typedef std::vector<int> array; //定义
array a; // 等价于std::vector<int>
3.平台无关数据类型
这个也是最常用的,比如整型在各个平台上长度可能不一样,使用typedef 可以以统一的名称使用相同的整型类型。
否则,平台A使用INT32表示32位整型,平台B使用__INT表示32位整型。这时分别使用
typdef INT32 int;
typdef __INT int;
就可以以统一的int在这两个平台上使用32位整型数据。
4.函数指针
这个功能非常有用。
普通函数
int func(int a) {return a;}
typedef int (*F)(int);
F f = func;
(*f)(2);
类成员函数
class A
{
public:
int func(int a){return a;}
};
typedef int (A::*CF)(int);
CF cf = &A::func;
A a;
(a.*cf)(2);
A* a2 = &a;
(a2->*cf)(2);
指针函数在循环场景中需要确定调用函数时很有用,类似于:
int funcA(){...}
int funcB(){...}
bool flag = true;
for(int i=0; i<n; ++i)
{
if(flag)
funcA();
else
funcB();
}
这种情况下使用函数指针非常方便。
int funcA(){...}
int funcB(){...}
typdef int(*F)();
bool flag = true;
F f;
if(flag) f = funcA;
else f = funcB;
for(int i=0; i<n; ++i)
{
f();
}