用途
1. 简化代码书写,尤其使用boost库,iterator或者指针等
typedef boost::filesystem::recursive_directory_iterator bf_rdit;
typedef char * PCHAR;// PCHAR p1, p2; // both p1 and p2 are pointer
2. 实现跨平台
#ifdef _WIN32 || WIN32
typedef __uint64 UINT64;
#else
typedef unsigned long long UINT64
#endif
使用
自定义枚举值
typedef enum {SUCCESS, FAIL} ERET;
自定义结构体/类
typedef struct {
char * data;
int length;
} Buffer;
函数指针
- 全局函数
typedef int (*BinaryOp)(int, int);
int g_Add(int lhs, int rhs)
{
return lhs + rhs;
}
// main function
{
BinaryOp pAdd = g_Add;
cout<<(*pAdd)(1,1)<<endl;
}
- 类静态成员函数
class CTestMath
{
public:
static int s_Add(int lhs, int rhs);
};
// main function
{
BinaryOp ps_Add = CTestMath::s_Add;
cout<<(*ps_Add)(1,1)<<endl;
}
- 类成员函数
class CTestMath
{
public:
CTestMath();
virtual ~CTestMath();
int m_Add(int lhs, int rhs);
protected:
private:
};
// main function
CTestMath *pinst = new CTestMath; // must
BinaryOp pm_Add = &CTestMath::m_Add;
cout<<(pinst->*pm_Add)(1,1)<<endl;
delete pinst;
-
结构体包含同类型指针
如下声明是不对的,因为Node是typedef出来的别名,而typedef是需要根据已有的结构类型来重命名的,现在_Node结构体还没有声明出来,就使用Node来作为类型来声明Next指针是不对的.
typedef struct _Node
{
int data;
Node * Next;
} Node;
解决方法有1. 先声明_Node结构体,同时使用typedef重命名结构名为Node.
typedef struct _Node{
int data;
struct _Node * Next;
} Node;
2. 或者先使用typedef来给一个还没有完全声明的类型起新名字,这跟第一钟情况是不一样的,因为它还没有开始创建呢
typedef struct _Node Node, * PNode;
struct _Node{
int data;
PNode Next;
};
不过建议还是用规范的第三种,
struct _Node{
int data;
struct _Node * Next;
};
typedef struct _Node Node, * PNode;
作用域
typedef可以在类中函数中出现,如果出现在类中,还跟public/private/protected的访问规则有关
class Test
{
public:
typedef char Buf[256];
};
// main function
{
Test::Buf buf;
cout<<sizeof(buf)<<endl;// 256
}
难点
typedef的使用在模块化编程中使用很多,也会出现很多难懂的声明
typedef int (*a[5])(int, int);
a是长度为5的数组指针,数组元素为函数指针,指向int(*)(int, int)函数签名
typedef void (*b[10]) (void (*)());
b是长度为10的数组指针,数组元素为函数指针,指向没有返回值,输入参数为一个函数指针的函数指针
误区
与define的区别
define是预编译中字符创形式替换代码,而typedef是具有强类型校验
//#define PCHAR char *;上述代码中如果PCHAR是使用define定义的,那实际函数需要的参数是const char *,而使用typedef将是char * const
typedef char * PCHAR;
int func(const PCHAR, const PCHAR);
误区