gpt4 book ai didi

windows - 包含 winuser.h 时出错。它将 ChangeMenu 定义为 ChangeMenuW 或 ChangeMenuA

转载 作者:可可西里 更新时间:2023-11-01 10:12:12 32 4
gpt4 key购买 nike

在 Windows 上开发 Qt 应用程序。我只在我的源文件中包含 QVboxLayout,这会导致错误,因为它的宏会覆盖我的方法名称。

foo.hpp
class foo
{
ChangeMenu();
}

foo.cpp
#include "foo.hpp"
#include "QVBoxLayout" // <--- this includes winuser.h

foo::ChangeMenu(){};

现在发生的是 winuser.h 有一个宏

#ifdef UNICODE
#define ChangeMenu ChangeMenuW
#else
#define ChangeMenu ChangeMenuA
#endif // !UNICODE

这将我的函数定义更改为 ChangeMenuW,但我的声明仍然是 ChangeMenu。

我该如何解决? winuser.h 怎么能把这样一个“正常”的名字定义成宏呢?

winuser.h的版本是“windows kits\10\include\10.0.16299.0”

最佳答案

几乎所有处理字符串的 Windows API 实际上都是解析为 A 或 W 版本的宏。没有办法,你可以:

  • 避免包含 windows.h,但正如您所注意到的,它会慢慢渗透;
  • 在定义/使用你的函数之前粗暴地#undef宏;这是对囤积此类正常且非宏外观标识符的适当惩罚,但它很乏味,而且一些其他代码实际上可能需要 Win32 函数;
  • 只是接受它作为生活中的一个悲惨事实,并避免使用所有相关的 Win32 API 名称;如果您使用 Qt 并遵循其命名约定,这应该很容易,因为 Qt 函数使用 lowerCamelCase(相对于 Win32 UpperCamelCase);
  • 在您的 header 中明确直接包含 windows.h(可能在 #ifdef _WIN32 下);这将确保您的标识符在所有实例中都被宏替换,因此即使编译器实际上将编译具有不同名称的函数,一切也会正常工作;适合独立项目,适合库。 (感谢 @Jonathan Potter 建议)

关于windows - 包含 winuser.h 时出错。它将 ChangeMenu 定义为 ChangeMenuW 或 ChangeMenuA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822884/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com