以前遇到这个问题一直没注意,注销掉完事。直到今天。。。
我付出了一个下午工程进度泡汤的代价,所以打算写出来,虽然这样将进一步使工程进度泡汤,不过想到也许挽救更多可能被泡汤的下午,也值:)
问题说起来也很简单:在托管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]