您的位置:首页 > 编程语言 > C语言/C++

真正VC++.net笔记5--MessageBox变MessageBoxA?

2005-11-12 17:31 459 查看
以前遇到这个问题一直没注意,注销掉完事。直到今天。。。

我付出了一个下午工程进度泡汤的代价,所以打算写出来,虽然这样将进一步使工程进度泡汤,不过想到也许挽救更多可能被泡汤的下午,也值:)

问题说起来也很简单:在托管C++的代码中使用MessageBox结果通不过编译,我的代码是这样的:MessageBox::Show("Oh,My God!");

编译错误为: error C2653: “MessageBoxA” : 不是类或命名空间名称

我靠!这不是强奸我的代码吗?我声明的明明是MessageBox,被强行替换成了MessageBoxA,还说是我的错:(

当然我声明了System::Windows::Forms 命名空间,更奇怪的是我在同一工程的.h下声明

MessageBox::Show("Oh,My God!");

结果顺利通过。。。彻底无语!

上网一阵狂搜(这就是我一个下午泡汤的原因),只了解了一点:也许是C宏引起的问题。另外还附带听取了一大堆关于C宏的是是非非的意见,对解决问题一点帮助都没有。

几乎绝望中,决定再试一次MSDN这根救命稻草,用MessageBoxA一搜:

。。。

//==========================================================================================

为什么即使我有命名空间,还是得到“MessageBoxA 不是‘System::Windows::Forms’成员”的错误信息?

这说明预处理器只执行文本替换,忽视了 MessageBox 是 System::Windows::Forms 命名空间的一部分这一情况。.NET Framework 不包括名为 MessageBoxA 的类,所以编译器生成错误。为解决此问题,可以使用 #undef 防止名称冲突,如下所示。

#include < windows.h >

#using < mscorlib.dll >

#using < System.Windows.Forms.dll >

#ifdef MessageBox

#undef MessageBox

#endif

int main()

{

System::Windows::Forms::MessageBox::Show("Hello, World!");

}

//==========================================================================================

MS清清楚楚的答案,我望着窗外渐黑的天空,欲哭无泪。。。

实际使用中,只要在主函数开始前声明#undef MessageBox即可。

:)

[WQL]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: