c-包含Windows.h导致错误A不是B的成员时
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c-包含Windows.h导致错误A不是B的成员时,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2359字,纯文字阅读大概需要4分钟。
内容图文
以下代码是我的包含文件:
但是,我发现当我使用#include< Windows.h>时,该项目无法编译,它将出现一个错误:
"LoadImageA": is not a member of "ImageData"
在这行上:
im.LoadImage("bg.png");
但是,如果我不使用#include`,一切正常.谁能帮我?
解决方法:
这是Win32 API的常见问题,会影响与支持TCHAR数据的Win32 API函数同名的任何符号.
在这种情况下,Windows.h包含winuser.h,该文件定义Win32 API LoadImage()函数,如下所示:
WINUSERAPI
HANDLE
WINAPI
LoadImageA(
__in_opt HINSTANCE hInst,
__in LPCSTR name,
__in UINT type,
__in int cx,
__in int cy,
__in UINT fuLoad);
WINUSERAPI
HANDLE
WINAPI
LoadImageW(
__in_opt HINSTANCE hInst,
__in LPCWSTR name,
__in UINT type,
__in int cx,
__in int cy,
__in UINT fuLoad);
#ifdef UNICODE
#define LoadImage LoadImageW
#else
#define LoadImage LoadImageA
#endif // !UNICODE
#define语句是引起您问题的原因. #define的作用域是全局的,不考虑文件边界,名称空间,类定义等.它只是文本的直接替换.因此,当您的代码调用此代码时:
im.LoadImage("bg.png");
预处理器将其更改为以下内容,这是编译器看到的内容:
im.LoadImageA("bg.png");
要么:
im.LoadImageW("bg.png");
取决于您是为MBCS还是Unicode编译项目(在这种情况下,您正在使用MBCS).
如果Microsoft对C开发人员更好,则Win32 API标头将使用内联函数而不是C宏,例如:
WINUSERAPI
HANDLE
WINAPI
LoadImageA(
__in_opt HINSTANCE hInst,
__in LPCSTR name,
__in UINT type,
__in int cx,
__in int cy,
__in UINT fuLoad);
WINUSERAPI
HANDLE
WINAPI
LoadImageW(
__in_opt HINSTANCE hInst,
__in LPCWSTR name,
__in UINT type,
__in int cx,
__in int cy,
__in UINT fuLoad);
#ifdef __cplusplus
inline HANDLE LoadImage(
__in_opt HINSTANCE hInst,
__in LPCTSTR name,
__in UINT type,
__in int cx,
__in int cy,
__in UINT fuLoad)
{
#ifdef UNICODE
return LoadImageW(hInst, name, type, cx, cy, fuLoad);
#else
return LoadImageA(hInst, name, type, cx, cy, fuLoad);
#endif // !UNICODE
}
#else
#ifdef UNICODE
#define LoadImage LoadImageW
#else
#define LoadImage LoadImageA
#endif // !UNICODE
#endif // !C++
这将允许对跨库,类等重复的任何名称进行适当的作用域划分和重载.但是,可惜的是,这些年来,Microsoft似乎不愿意这样做:( Win32 API主要是为C和其他与C兼容的语言设计的,它提供了对C的规定很少(不包括GDI,COM??等).
无论如何,针对您的情况,最简单的解决方案是:
>将ImageData.LoadImage()方法重命名为更唯一的名称.
>使用#undef LoadImage语句(假设您不需要在源文件中的其他任何地方使用实际的Win32 API LoadImage()函数):
#undef LoadImage
im.LoadImage("bg.png");
或者,如果您想限制一点:
#ifdef _WINUSER_
#undef LoadImage
#endif
im.LoadImage("bg.png");
内容总结
以上是互联网集市为您收集整理的c-包含Windows.h导致错误A不是B的成员时全部内容,希望文章能够帮你解决c-包含Windows.h导致错误A不是B的成员时所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。