CodeMap

慎言笃行

导航

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

 

以前遇到这个问题一直没注意,注销掉完事。直到今天。。。

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

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

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

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

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

MessageBox::Show("OhMy 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]

posted on 2005-11-12 17:31  wqlblogger  阅读(2451)  评论(2编辑  收藏  举报