访问 int 是否为 unsigned long undefined 行为?

Is accessing int as unsigned long undefined behavior?

在一本叫做编程 Windows 的书中,在其中一个示例中,我们有 this 行:

ReadFile (hFile, buffer, MAXREAD, &i, NULL) ;

i 这里是 previously declared as int, but the 4th argument of ReadFileLPDWORD,这是 DWORD* 的类型定义,DWORDunsigned long 的类型定义.它实际上是双关语。在大多数系统上 unsigned longint 大小相同,但我认为访问变量就好像它是其他类型一样是未定义的行为。这样可以吗?只有大小相同才可以吗?这是UB吗?我查了几个勘误表网站,他们似乎没有列出这个。我错过了什么吗?

如果 DWORD 按照您的描述定义,则代码包含编译器必须诊断的约束违规,并且标准不再涵盖生成的任何可执行文件的行为。 int *unsigned long *,不管类型的大小。

如果您没有看到编译器错误消息,我强烈建议您调整编译器设置,以便显示错误消息。一些编译器默认为这个错误显示 "warning" 消息,这可能会误导粗心的人认为没有真正的问题。