【发布时间】:2020-04-01 22:13:29
【问题描述】:
在一本名为 Programming Windows 的书中,在其中一个示例中,我们有 this 行:
ReadFile (hFile, buffer, MAXREAD, &i, NULL) ;
i 这里是previously 声明为int,但ReadFile 的第四个参数是LPDWORD,这是DWORD* 的typedef,DWORD 是unsigned long 的typedef .它实际上是类型双关语。在大多数系统上,unsigned long 和 int 的大小相同,但我认为像访问其他类型一样访问变量是未定义的行为。这样好吗?仅当尺寸相同时才可以吗?这是UB吗?我检查了几个勘误表网站,他们似乎没有列出这个。我错过了什么吗?
【问题讨论】:
-
在大多数系统上,
unsigned long和int大小相同 不,它们不是。 Windows 是这里的异常值。在几乎所有其他 64 位架构上,int是 32 位,而[unsigned] long是 64 位。 -
这是书中的错误。
i应声明为DWORD。 -
如果读到2GB(第31位为零),没有问题。
-
请注意,最近 VC++ 会对此发出警告。这不是最佳做法。
标签: c winapi type-punning