首页 > 解决方案 > C:在处理 32 位程序时,在 Windows 64 位机器上将 int 转换为 int* 时出现警告

问题描述

我正在开发一个传统的 32 位程序,其中有很多演员表,比如DWORD* a = (DWORD*)b, where bis a native int,我收到很多这样的警告:

Cast to 'DWORD *' (aka 'unsigned int*') from smaller integer type 'int' ['clang: -Wint-to-pointer-cast]

由于在编译期间大小相等,这很好,但我不知道 Clang 是如何知道的。除了完全禁用它之外,我还能做些什么来满足这个警告?

编辑:由于我对编译器 Clang 和调用 Clang 的语言服务器 clangd 的误解,问题的前提很糟糕。语言服务器不知道我的目标是 x86。

标签: cwindowspointersx86clang

解决方案


所以问题是(DWORD*)bbutb是 type int。这意味着代码需要重新设计,因为有人将指针填充到int. Microsoft 为指针大小的整数制作了一种特殊类型:DWORD_PTR. 是的,肯定有一个,stdint.h如果你愿意,你可以使用那个,但如果你已经在使用DWORD,你不妨使用DWORD_PTR. 这条线没有出现问题。问题发生在b从指针分配值的行上。

将类型更改bintptr_tuintptr_tDWORD_PTR并反向传播更改,直到错误消失。如果你到了你不能的地方,那部分代码就需要重新设计。

即使在 32 位编译中,当类型不是整数指针类型之一时,Microsoft 自己的编译器现在也会对这些东西产生警告。最好是警告。

在整数中填充指针不再是推荐的做法,但 Win32 API 无处不在,所以在罗马时......


推荐阅读