C 64位Windows中的SetWindowPos编译错误

C 64位Windows中的SetWindowPos编译错误,c,winapi,visual-studio-2012,C,Winapi,Visual Studio 2012,我目前正在修改我们的代码库,使其在64位体系结构下编译。我要做的大部分改变都是显而易见的,但这一点让我感到困惑SetWindowPos还有第二个参数,HwnInsertafter,它可以是窗口句柄,也可以是预定义的值之一HWND_TOP、HWND_BOTTOM、HWND_TOPMOST(请参阅MSDN信息)。这些值在WinUser.h中定义 在32位体系结构中,在调用SetWindowPos时使用其中一个可以正常工作,但在64位中,编译器会这样抱怨: 警告C4306:“类型强制转换”:从的“in

我目前正在修改我们的代码库,使其在64位体系结构下编译。我要做的大部分改变都是显而易见的,但这一点让我感到困惑
SetWindowPos
还有第二个参数,
HwnInsertafter
,它可以是窗口句柄,也可以是预定义的值之一
HWND_TOP
HWND_BOTTOM
HWND_TOPMOST
(请参阅MSDN信息)。这些值在
WinUser.h
中定义

在32位体系结构中,在调用
SetWindowPos
时使用其中一个可以正常工作,但在64位中,编译器会这样抱怨:

警告C4306:“类型强制转换”:从的“int”转换为“HWND” 更大尺寸

这是因为#defines将[32位]整数转换为hwnd,例如:

#定义HWND\u最顶层((HWND)-1)


要在64位体系结构中编译而不让编译器抛出警告,我需要做哪些更改?我可以使用
#pragma warning(disable:4306)
禁用警告,也可以使用#define中的64位int创建自己的定义,但肯定有一个“正确的”Microsoft执行此操作的方法?

触发此警告是因为您正在将32位
int
-1
强制转换为64位指针类型
void*
,而没有任何干预转换为64位整数类型,例如
intptr\u t
。在这种情况下,MSVC本应抑制该警告,因为(A)它仅由系统提供的宏
HWND_TOPMOST
的扩展触发,(B)有问题的
int
是十进制文字,但显然MSVC的开发人员没有想到这些启发式

除非您满意,否则在代码中您无法使警告静音

#undef HWND_TOPMOST
#define HWND_TOPMOST ((HWND)(intptr_t)-1)
或者,您可以尝试在IDE中抑制它。暗示

项目设置| C/C++|常规并关闭“检测64位可移植性问题”


或者在命令行上通过
/wd4306

好的,经过大量测试后,问题是我的文件是.c文件。我将其重命名为.cpp和SetWindowPos,然后编译时没有出现错误(相反,在我创建的新测试应用程序中,我尝试了一个“基本”解决方案,当我将默认的.cpp文件重命名为.c文件时,它开始抱怨)


看起来.c文件不希望将32位
int
值强制转换为64位指针。这是有道理的,但不能解释为什么它在.cpp文件中工作。如果有人对原因有任何想法,请在评论中注明…

此处有问题。HWND_u*被强制转换为HWND,因此它应该可以正常工作。如果手动将其替换为(HWND)-1会发生什么情况?它会抱怨。如果我把它改成
(HWND)-1i64
,它会很高兴…我发现了。这似乎是VS/SDK的一个bug,在最新版本中已修复。我们在VS2008或VS2012中都没有收到此警告。请确保正确设置SDK包含路径。订单很重要。最新的Windows SDK应该在列表的最顶端。这正是我正在做的:取消对它的定义,然后将它重新定义为-1i64。我可以用我在问题中提到的pragma来抑制警告,但我更愿意在忽略警告之前找到问题的根源。他们在那里是有原因的(大多数时候)。@NickShaw,我无法从你的评论中判断你是否说你仍然不理解警告的原因。正如我在这个答案中所说,它是一个“64位可移植性”警告,通过隐式地将32位整数类型转换为64位类型触发。我是否应该进一步说明这一解释?解释<代码> /WP64 < /C>在MSVC 2008中在合法C++代码中导致虚假警告。显然微软最终禁用它的C++代码(其中大部分的假阳性),但留下它启用的C代码。不管怎么说,MSVC的现代版本显然把它完全删除了,所以你可以随时升级。(发出叮当声。)我想升级到VS2013,看看它是否摆脱了警告。我会看看我是否能抽出时间做那件事。:)谢谢你的链接-非常有趣。