作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 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 函数;windows.h
(可能在 #ifdef _WIN32
下);这将确保您的标识符将在所有实例中都被宏替换,因此即使编译器实际上将编译具有不同名称的函数,一切也会正常工作;适合独立项目,不适合库。 (感谢 @Jonathan Potter 建议)关于windows - 包含 winuser.h 时出错。它将 ChangeMenu 定义为 ChangeMenuW 或 ChangeMenuA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822884/
在 Windows 上开发 Qt 应用程序。我只在我的源文件中包含 QVboxLayout,这会导致错误,因为它的宏会覆盖我的方法名称。 foo.hpp class foo { ChangeM
我是一名优秀的程序员,十分优秀!