Typedef关键字在开发中的常应用和注意点

typedef的一些常见作用

1.库需要更改成Windows 32/64位可用,一些成熟的代码中经常可以见到如下身影,如VC标准库中:
#ifdef _WIN64
    typedef unsigned   __int64 size_t;
#else
    typedef unsigned int   size_t;
#endif

这样我们使用一个datadefine.h,把常用数据类型都定义在里面,开发的时候如果要使用int,声明size_t即可,这样就不会出现一些运算时数据边界的问题,比如有的机器精度达不到double等情况
并且该方法也可以用在跨平台Linux中

2.为复杂的声明定义一个新的简单的别名
typedef const char * pstr;
//使用时隐藏指针
bool compareString(pstr a, pstr b);

但是会有一个常见的隐藏问题
如下代码

typedef char * pstr;
bool compareString(const pstr a,const  pstr b);

这个看起来和上面看起来是一样的。但是用GNU的gcc和g++编译器是完全不一样的。会被解释成

bool compareString(char* const a,char* const b);
一旦解释成这个我代码里本来是想比较两个字符串是否相等的,
但是const是指针的常量了,而非指针指向的值的常量,
这样我遍历a的时候使用a++就会报错,因为这个指针指向的地址不允许更改

另外如果非跨位数的项目,一般那些比较资深的编程者会告诉我不太复杂的数据,尽量不要用typedef重新起个别名。 auto也尽量少用看起来比较直观
//如果项目中真的出现了std::map<int,map<int,map<>>>等此类非常复杂的数据结构,一定程度要考虑重新设计数据了。而不是强行使用这个map

3.常见的typedef结构体区别

经常会见到有如下的结构体定义
1.最旧的C语言版本

struct MyTest
 {
    int x;
    int y; 
};
struct MyTest p1;
该版本下,要创建一个结构体,必须前置声明struct

2.后来为了方便一些,C语言开发者创使用了typedef

typedef struct test1
 {
    int x;
    int y; 
}MyTest;
MyTest  p1;

声明这样编译器干了两件事:
1.和最旧版本一样声明了一个结构体
2.typedef struct test1 MyTest;

这样创建一个结构体就无需前置声明struct了。

3.C++后,直接连typedef都不要了

struct MyTest
 {
    int x;
    int y; 
};
这样的话就声明了一个结构体,但是他没有任何变量,如果我们要声明一个结构体变量
只需要:
MyTest test1;  
test1.x=77;
test1.y=77;
struct MyTest
 {
    int x;
    int y; 
} test1;
这样的话就声明了一个结构体,并且默认创建了一个test1的变量
我们可以直接使用test1 
test1.x=77;
test1.y=77;

这几种基本没什么本质的区别,本意都是定义一个结构体,只是不同的编译器可能会有差别,如果项目真的放到非常旧的GCC上编译,第三种的定义方法就会报错了

上一篇:MySQL 大表硬连接删除


下一篇:Apache负载均衡配置(反向代理模式)