c - C:在处理 32 位程序时,在 Windows 64 位机器上将 int 转换为 int* 时出现警告
问题描述
我正在开发一个传统的 32 位程序,其中有很多演员表,比如DWORD* a = (DWORD*)b
, where b
is a native int
,我收到很多这样的警告:
Cast to 'DWORD *' (aka 'unsigned int*') from smaller integer type 'int' ['clang: -Wint-to-pointer-cast]
由于在编译期间大小相等,这很好,但我不知道 Clang 是如何知道的。除了完全禁用它之外,我还能做些什么来满足这个警告?
编辑:由于我对编译器 Clang 和调用 Clang 的语言服务器 clangd 的误解,问题的前提很糟糕。语言服务器不知道我的目标是 x86。
解决方案
所以问题是(DWORD*)b
butb
是 type int
。这意味着代码需要重新设计,因为有人将指针填充到int
. Microsoft 为指针大小的整数制作了一种特殊类型:DWORD_PTR
. 是的,肯定有一个,stdint.h
如果你愿意,你可以使用那个,但如果你已经在使用DWORD
,你不妨使用DWORD_PTR
. 这条线没有出现问题。问题发生在b
从指针分配值的行上。
将类型更改b
为intptr_t
、uintptr_t
或DWORD_PTR
并反向传播更改,直到错误消失。如果你到了你不能的地方,那部分代码就需要重新设计。
即使在 32 位编译中,当类型不是整数指针类型之一时,Microsoft 自己的编译器现在也会对这些东西产生警告。最好是警告。
在整数中填充指针不再是推荐的做法,但 Win32 API 无处不在,所以在罗马时......
推荐阅读
- postgresql - pgx lib中的命名预处理语句,它是如何工作的?
- javascript - 在电子中,我如何加载一个 URL 作为我的启动器而不是本地文件
- java - 将 JSON 插入 SQLite(GSON + Volley)
- python - 合并类对象列表
- javascript - 服务工作者可以获取和缓存跨域资产吗?
- python - Python从dict创建对象列表
- c# - 需要在发送到核心 2 中的 API 之前修改查询参数
- autocad-plugin - 为什么加载我的 dll 后我的自定义命令没有显示在 AutoCAD 控制台中
- mysql - MySQL中的距离计算与Great Circle Mapper不同
- r - 当我尝试从 tif 文件中提取值时,为什么会得到 NA?