【发布时间】:2013-02-17 01:01:05
【问题描述】:
在将我当前的 32 位应用程序移植到 64 位的过程中,我添加了编译器选项 /we4302(请参阅 SO Question Clarification: Porting 32 to 64 bit 和 Hans Passant 的建议答案),我遇到了一个包含 ATLMFC 的场景文件似乎有指针截断。
c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\ATLMFC\INCLUDE\afxtempl.h
(163) : error C4302: 'type cast' : truncation from 'CControlBar *' to 'long'
c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\ATLMFC\INCLUDE\afxtempl.h
(163) : error C4302: 'type cast' : truncation from 'HMENU ' to 'long'
我打算将编译器标志永久添加到我们的构建系统中,但如果我们在 MFC 包含中遇到问题,那将是一个坏主意。
所以我的问题是
- 报告的问题是错误警告吗?
- 如果这确实导致指针截断,建议的解决方案是什么
- 在构建系统中添加编译器选项 /we4302 是不是一个坏主意?
【问题讨论】:
-
对于 MS 编译器,
long在 32 位和 64 位模式下都是 32 位。这意味着指针不适合,这绝对是个问题。 -
另一方面,第 163 行似乎计算了一个哈希值
ldiv_t HashVal = ldiv((long)(ARG_KEY)key, 127773);,其中 key 已经是 ARG_KEY 类型,所以我真的不知道。
标签: c++ windows visual-c++ mfc atl