7

我目前正在更改我们的代码库以使其在 64 位架构下编译。我必须做出的大部分改变都是显而易见的,但这让我很困惑。 SetWindowPos有第二个参数,hWndInsertAfter可以是窗口句柄,也可以是预定义值之一HWND_TOP,和(有关 MSDN 信息,请参见HWND_BOTTOM此处。这些值在 中定义。HWND_TOPMOSTHWND_NOTOPMOSTWinUser.h

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

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

这是因为#defines 将 [32-bit] 整数转换为 HWND,例如:

#define HWND_TOPMOST ((HWND)-1)

我需要更改哪些内容才能在 64 位架构中编译而编译器不会发出警告?我可以使用 禁用警告#pragma warning( disable: 4306 ),或者在#define 中使用 64 位 int 进行我自己的定义,但肯定有一种“正确”的 Microsoft 方式来执行此操作吗?

4

2 回答 2

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 中抑制它。这个线程建议

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

/wd4306或在命令行上传递。

于 2013-11-10T06:21:03.077 回答
1

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

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

于 2013-11-11T12:13:37.267 回答