Windows数据类型…为什么这么多/不可写?

前端之家收集整理的这篇文章主要介绍了Windows数据类型…为什么这么多/不可写?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有人可以准确地指出为什么定义了以下typedefs /#定义?与原件相比,它们有什么价值?
typedef char CHAR;
#define CONST const
typedef float FLOAT;

typedef unsigned __int64 DWORD64; //A 64-bit "double"-word?!
typedef ULONGLONG DWORDLONG;      //What's the difference?

typedef ULONG_PTR DWORD_PTR;      //What's the difference?
typedef long LONG_PTR;            //Wasn't INT_PTR enough?

typedef signed int LONG32;        //Why not "signed long"?
typedef unsigned int UINT;        //Wait.. UINT is "int","LONG" is also int?
typedef unsigned long ULONG;      //ULONG is "long",but LONG32 is "int"? what?

typedef void *PVOID;              //Why not just say void*?
typedef void *LPVOID;             //What?!

typedef ULONG_PTR SIZE_T;         //Why not just size_t?

最重要的是:

#define VOID void                 //Assuming this is useful (?),why not typedef?

这些背后的原因是什么?是不是有些抽象我不明白?

编辑:

对于那些提到编译器交叉兼容性的人:

我的问题不在于为什么他们不使用unsigned long long而不是DWORD64。我的问题是为什么任何人使用DWORD64而不是ULONG64(反之亦然)?那些不是64位宽的类型?

或者,作为另一个例子:即使在一个“假设”编译器,这意味着欺骗我们在各方面,ULONG_PTR和UINT_PTR和DWORD_PTR之间的区别是什么?所有抽象数据类型不是仅仅意味着同样的事情 – SIZE_T?

但是,我问为什么他们使用ULONGLONG而不是长久 – 有什么潜在的意义上的差异,既不长久也不是DWORDLONG?

这些冗余名称中的大多数主要存在两个原因:

>它们是为了向后兼容而保留的历史类型
>他们是来自不同开发人员团队的同一类型的不同名称(对于像Windows这样的巨大项目,团队来说,保持一致性是非常困难的)

typedef char CHAR;

char的符号可以在平台和编译器之间变化,所以这是一个原因。原始开发人员也可能会保留这个开放的字符编码的未来变化,但是当然这是不再相关的,因为我们现在为了这个目的而使用TCHAR。

typedef unsigned __int64 DWORD64; //A 64-bit "double"-word?!

在64位移动期间,他们可能发现一些DWORD参数真的需要64位长,并且可能将其重命名为DWORD64,以便这些API的现有用户不被混淆。

typedef void *PVOID;              //Why not just say void*?
typedef void *LPVOID;             //What?!

这一个可以追溯到16位的日子,当时有一个常规的“近”指针,它们是32位的16位和“远”指针。类型上的L前缀代表“长”或“远”,现在是无意义的,但在那些日子里,这些可能定义如下:

typedef void near *PVOID;
typedef void far *LPVOID;

更新:对于FLOAT,UINT和ULONG,这些只是“更抽象是好的”的例子,考虑到未来的变化。请记住,Windows还可以在除x86之外的平台上运行 – 您可以想到一种以非标准格式表示浮点数的架构,并且API函数已优化以利用此表示。这可能与C的浮点数据类型相冲突。

猜你在找的Windows相关文章