我不害怕承认我是一个 C++ 新手,所以这似乎是一个愚蠢的问题,但是......
我看到在代码示例中到处使用 DWORD。当我查看 DWORD 的真正含义时,它显然只是一个无符号整数(0 到 4,294,967,295)。所以我的问题是,为什么我们有 DWORD?整数类型“unsigned int”没有给我们什么?它与便携性和机器差异有关吗?
DWORD
不是 C++ 类型,它在<windows.h>
.
原因是DWORD
Windows 函数依赖于特定的范围和格式,因此如果您需要该特定范围,请使用该类型。(或者正如他们所说的“在罗马时,像罗马人那样做。”)对你来说,这恰好对应于unsigned int
,但情况可能并非总是如此。为了安全起见,请在预期DWORD
a 时使用DWORD
,无论它实际上是什么。
例如,如果他们改变了范围或格式,unsigned int
他们可以使用不同的类型来底层DWORD
来保持相同的需求,并且所有使用的代码DWORD
都将是不明智的。(同样,他们可以决定DWORD
需要unsigned long long
,更改它,并且所有使用的代码DWORD
都不会更明智。)
另请注意,unsigned int
范围不必为 0 到 4,294,967,295。见这里。
MS-DOS 和 Windows 3.1 在 16 位模式下运行时,Intel 8086 字为 16 位,Microsoft WORD 为 16 位,Microsoft DWORD 为 32 位,典型编译器的 unsigned int 为 16 位。
当 Windows NT 在 32 位模式下运行时,Intel 80386 字为 32 位,Microsoft WORD 为 16 位,Microsoft DWORD 为 32 位,典型编译器的 unsigned int 为 32 位。WORD 和 DWORD 这两个名称不再具有自我描述性,但它们保留了 Microsoft 程序的功能。
Windows 在 64 位模式下运行时,Intel 字为 64 位,Microsoft WORD 为 16 位,Microsoft DWORD 为 32 位,典型编译器的 unsigned int 为 32 位。WORD 和 DWORD 的名称不再具有自描述性,并且 unsigned int 不再符合最小意外原则,但它们保留了许多程序的功能。
我认为 WORD 或 DWORD 永远不会改变。
SDK 开发人员更喜欢使用 typedef 定义自己的类型。这允许仅在一处更改基础类型,而无需更改所有客户端代码。遵守这个约定很重要。DWORD 不太可能被改变,但是像 DWORD_PTR 这样的类型在不同的平台上是不同的,比如 Win32 和 x64。因此,如果某些函数具有 DWORD 参数,请使用 DWORD 而不是 unsigned int,您的代码将在所有未来的 Windows 标头版本中编译。
对于我自己,我会假设 unsigned int 是特定于平台的。整数可以是 8 位、16 位、32 位甚至 64 位。
另一方面,DWORD 指定它自己的大小,即双字。Word 是 16 位,因此 DWORD 在所有平台上都称为 32 位