为什么Win32 API中没有使用标准数据类型?

时间:2013-02-20 16:42:42

标签: c++ c winapi types

我一直在学习Visual C ++ Win32编程。 为什么使用DWORDWCHARUINT等数据类型而不是unsigned longcharunsigned int等等上?

我必须记住何时使用WCHAR而不是const char *,这真的很烦我。 为什么不首先使用标准数据类型?如果我记住Win32等价物并将它们用于我自己的变量会有帮助吗?

3 个答案:

答案 0 :(得分:17)

是的,您应该为函数的参数使用正确的数据类型,否则您可能会遇到麻烦。

这些类型按照它们的方式定义的原因,而不是使用intchar等等,它会删除"无论编译器认为是什么{{1应该大小为"来自OS的界面。这是一件非常好的事情,因为如果你使用编译器A,编译器B或编译器C,它们都将使用相同的类型 - 只有库接口头文件需要做正确定义类型的事情。

通过定义非标准类型的类型,可以很容易地将int从16位更改为32位。 Windows的第一个C / C ++编译器使用16位整数。只是在1990年代中后期,Windows获得了32位API,直到那时,您使用的是{16}的int。想象一下,你有一个运行良好的程序,它使用了几百个int个变量,而且突然之间,你必须将所有这些变量改为其他东西......不会很好,对吧 - 特别是因为某些变量需要改变,因为为某些代码移动到32位int会产生任何不同,所以没有必要改变这些位。

应该注意intWCHAR不同 - const char是"宽字符"所以WCHAR是可比的类型。

所以,基本上,"定义我们自己的类型"是一种保证可以更改底层编译器体系结构的方法,而无需更改(大部分)源代码。所有进行机器编码的大型项目都会做这种事情。

答案 1 :(得分:11)

intlong等内置类型的大小和其他特性因编译器而异,通常取决于运行代码的系统的基础架构

例如,在最初实现Windows的16位系统上,int只有16位。在更现代的系统中,int是32位。

Microsoft可以定义类似DWORD的类型,以便它们的大小在其编译器的不同版本或用于编译Windows代码的其他编译器中保持相同。

这些名称旨在反映微软定义的底层系统的概念。 DWORD是一个“双字”(如果我没记错的话,在Windows上是32位,即使机器“字”在现代系统上可能是32位甚至64位)。

最好使用<stdint.h>中定义的固定宽度类型,例如uint16_tuint32_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的情况下,他们得到了TCHARCHARWCHAR的问题,但这是另一个故事。

然后,它变得失去控制,你得到了typedef void VOID, *PVOID;这些完全无稽之谈的好东西。