我正在开发一个遗留的32位程序,其中有许多像DWORD* a= (DWORD*)b
这样的强制转换,其中b
是一个本机int
,我收到了很多这样的警告:
Cast to 'DWORD *‘(aka 'unsigned int*') from smaller integer type 'int’['clang:-Wint-to-pointer-cast]
因为在编译过程中大小是相等的,所以这没问题,但我不明白Clang是怎么知道这一点的。除了完全禁用它之外,我还能做些什么来满足此警告?
编辑:这个问题的前提是不好的,因为我误解了Clang,一个编译器,和clangd,调用Clang的语言服务器。语言服务器不知道我的目标是x86。
发布于 2021-02-28 02:22:01
所以问题出在(DWORD*)b
上,但b
的类型是int
。这意味着需要重新设计代码,因为有人正在将指针填充到int
中。微软为指针大小的整数创建了一个特殊的类型:DWORD_PTR
。当然,在stdint.h
中有一个,如果你愿意,你可以使用它,但是如果你已经在使用DWORD
,你可以使用DWORD_PTR
。问题不是在这条线路上发生的。问题发生在从指针为b
赋值的那一行。
将b
的类型更改为intptr_t
、uintptr_t
或DWORD_PTR
,并保留更改,直到错误消失。如果你来到一个你不能做到的地方,那部分代码需要重新设计。
微软自己的编译器现在甚至在32位编译中,当类型不是整数指针类型时也会产生警告。最好以警告为首。
在整数中填充指针不再是推荐的做法,但Win32应用编程接口到处都是这样做的,所以在罗马...
https://stackoverflow.com/questions/66399930
复制相似问题