访问 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 ReadFile
是 LPDWORD
,这是 DWORD*
的类型定义,DWORD
是 unsigned long
的类型定义.它实际上是双关语。在大多数系统上 unsigned long
和 int
大小相同,但我认为访问变量就好像它是其他类型一样是未定义的行为。这样可以吗?只有大小相同才可以吗?这是UB吗?我查了几个勘误表网站,他们似乎没有列出这个。我错过了什么吗?
如果 DWORD
按照您的描述定义,则代码包含编译器必须诊断的约束违规,并且标准不再涵盖生成的任何可执行文件的行为。 从 int *
到 unsigned long *
,不管类型的大小。
如果您没有看到编译器错误消息,我强烈建议您调整编译器设置,以便显示错误消息。一些编译器默认为这个错误显示 "warning" 消息,这可能会误导粗心的人认为没有真正的问题。
在一本叫做编程 Windows 的书中,在其中一个示例中,我们有 this 行:
ReadFile (hFile, buffer, MAXREAD, &i, NULL) ;
i
这里是 previously declared as int
, but the 4th argument of ReadFile
是 LPDWORD
,这是 DWORD*
的类型定义,DWORD
是 unsigned long
的类型定义.它实际上是双关语。在大多数系统上 unsigned long
和 int
大小相同,但我认为访问变量就好像它是其他类型一样是未定义的行为。这样可以吗?只有大小相同才可以吗?这是UB吗?我查了几个勘误表网站,他们似乎没有列出这个。我错过了什么吗?
如果 DWORD
按照您的描述定义,则代码包含编译器必须诊断的约束违规,并且标准不再涵盖生成的任何可执行文件的行为。 int *
到 unsigned long *
,不管类型的大小。
如果您没有看到编译器错误消息,我强烈建议您调整编译器设置,以便显示错误消息。一些编译器默认为这个错误显示 "warning" 消息,这可能会误导粗心的人认为没有真正的问题。