我一直在学习Visual C ++ Win32编程。
为什么使用DWORD
,WCHAR
,UINT
等数据类型而不是unsigned long
,char
,unsigned int
等等上?
我必须记住何时使用WCHAR而不是const char *,这真的很烦我。 为什么不首先使用标准数据类型?如果我记住Win32等价物并将它们用于我自己的变量会有帮助吗?
答案 0 :(得分:17)
是的,您应该为函数的参数使用正确的数据类型,否则您可能会遇到麻烦。
这些类型按照它们的方式定义的原因,而不是使用int
,char
等等,它会删除"无论编译器认为是什么{{1应该大小为"来自OS的界面。这是一件非常好的事情,因为如果你使用编译器A,编译器B或编译器C,它们都将使用相同的类型 - 只有库接口头文件需要做正确定义类型的事情。
通过定义非标准类型的类型,可以很容易地将int
从16位更改为32位。 Windows的第一个C / C ++编译器使用16位整数。只是在1990年代中后期,Windows获得了32位API,直到那时,您使用的是{16}的int
。想象一下,你有一个运行良好的程序,它使用了几百个int
个变量,而且突然之间,你必须将所有这些变量改为其他东西......不会很好,对吧 - 特别是因为某些变量需要改变,因为为某些代码移动到32位int会产生任何不同,所以没有必要改变这些位。
应该注意int
与WCHAR
不同 - const char
是"宽字符"所以WCHAR
是可比的类型。
所以,基本上,"定义我们自己的类型"是一种保证可以更改底层编译器体系结构的方法,而无需更改(大部分)源代码。所有进行机器编码的大型项目都会做这种事情。
答案 1 :(得分:11)
int
和long
等内置类型的大小和其他特性因编译器而异,通常取决于运行代码的系统的基础架构
例如,在最初实现Windows的16位系统上,int
只有16位。在更现代的系统中,int
是32位。
Microsoft可以定义类似DWORD
的类型,以便它们的大小在其编译器的不同版本或用于编译Windows代码的其他编译器中保持相同。
这些名称旨在反映微软定义的底层系统的概念。 DWORD
是一个“双字”(如果我没记错的话,在Windows上是32位,即使机器“字”在现代系统上可能是32位甚至64位)。
最好使用<stdint.h>
中定义的固定宽度类型,例如uint16_t
和uint32_t
- 但这些类型仅在1999年引入C语言ISO C标准(即使在今天,Microsoft的编译器也不完全支持)。
如果您正在编写与Win32 API交互的代码,那么您肯定应该使用该API定义的类型。对于不与Win32交互的代码,请使用您喜欢的任何类型,或者您正在使用的界面建议的任何类型。
答案 2 :(得分:10)
我认为这是一次历史性事故。
我的理论是,最初的Windows开发人员知道标准的C类型大小取决于编译器,也就是说,一个编译器可能有16位整数,另一个编译器可能有32位整数。所以他们决定使用一系列typedef在不同的编译器之间移植Window API:DWORD
是一个32位无符号整数,无论你使用什么编译器/架构。当然,现在您将使用uint32_t
中的<stdint.h>
,但当时无法使用此版本。
然后,在UNICODE的情况下,他们得到了TCHAR
与CHAR
与WCHAR
的问题,但这是另一个故事。
然后,它变得失去控制,你得到了typedef void VOID, *PVOID;
这些完全无稽之谈的好东西。