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上编译,第三种的定义方法就会报错了
标签:test1,pstr,Typedef,struct,MyTest,int,typedef,关键字,应用 来源: https://blog.csdn.net/qq_40861091/article/details/118970951