我正在改变我们的代码库,使其在64位架构下进行编译。我必须做出的大部分改变是显而易见的,但这一次让我感到难过。 SetWindowPos
有第二个参数hWndInsertAfter
,可以是窗口句柄,也可以是预定义值HWND_TOP
,HWND_BOTTOM
,HWND_TOPMOST
和{{ 1}}(有关MSDN信息,请参阅here)。这些值在HWND_NOTOPMOST
中定义。
在32位体系结构中,使用WinUser.h
调用中的一种工作正常,但在64位中,编译器因此抱怨:
警告C4306:'type cast':从'int'转换为'HWND' 更大的尺寸
这是因为#defines正在将[32位]整数转换为HWND,例如:
SetWindowPos
如果没有编译器发出警告,我需要更改什么才能在64位架构中进行编译?我可以使用#define HWND_TOPMOST ((HWND)-1)
禁用警告,或者使用#define中的64位int进行自己的定义,但是肯定有一种“正确”的Microsoft方式吗?
答案 0 :(得分:1)
触发警告是因为您将32位int
值-1
转换为64位指针类型void*
,而没有任何插入转换为64位整数类型例如intptr_t
。在这种情况下,MSVC 应该已经抑制了警告,因为(A)它仅由系统提供的宏HWND_TOPMOST
的扩展触发,而(B)违规int
是一个十进制文字,但显然MSVC的开发人员没有想到那些启发式。
除非你对
感到满意,否则你的代码中没有任何东西可以使警告静音#undef HWND_TOPMOST
#define HWND_TOPMOST ((HWND)(intptr_t)-1)
或者,您可以尝试在IDE中禁止它。 This thread建议
项目设置| C / C ++ |常规并关闭“检测64位可移植性问题”
或在命令行上传递/wd4306
。
答案 1 :(得分:1)
好的,经过多次测试,问题是我的文件是.c文件。我将其重命名为.cpp和SetWindowPos然后编译没有错误(相反,在我创建的新测试应用程序中尝试'裸骨'解决方案,当我将默认.cpp文件重命名为.c文件时,它开始抱怨)
看起来.c文件不希望能够将32位int
值转换为64位指针。这是有道理的,但没有解释为什么它在.cpp文件中有效。如果有人对此有任何想法,请在评论中注明......