窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++

Posted

技术标签:

【中文标题】窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++【英文标题】:"error C2653: System is not a class or a namespace name" in Form header file, Visual C++ 【发布时间】:2013-04-02 11:40:11 【问题描述】:

我之前关于同一个项目的问题:one 和 two。没有必要阅读它们;只知道我正在尝试在 Visual C++ 项目中使用本机 C++ SDK。这比我最初想象的要复杂得多,但是这个关于Extending a native C++ project with managed code 的网站已经帮助了我很多。

根据最后一个链接的说明,我已向我的本地 C++ 项目添加了一个表单,该项目已自动将项目转换为 CLR 项目。不过,只有 MainForm.cppInterface.cpp(允许本地 C++ 代码创建和显示 MainForm 的文件)使用 /clr 标志编译;其他文件保持原生。

我现在遇到的问题是,Visual Studio 似乎无法识别 MainForm.h 中使用的任何 CLR 内容。因此,在以下几行中:

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

System 这个词总是带有红色下划线,并带有相应的错误:

error C2653: 'System' is not a class or a namespace name

对于每一行。

它也不能识别单词gcnew 和其他应该在 CLR 中毫不费力地工作的东西。

谁能告诉我我做错了什么?我的猜测是它非常小。一些我忘记更改的标志,缺少参考或类似的东西,但我无法弄清楚它是什么。

【问题讨论】:

你在哪里包含MainForm.h?如果你将它包含在任何/clr编译的翻译单元(即*.cpp)中,那么编译器当然会抱怨它,因为namespace Systemgcnew不是标准 C++ 的一部分。 我把它包含在Interface.h中。 Interface.cpp 是用 /clr 编译的,但正如我帖子中的第三个链接所说,这应该可以。 好的,你在哪里包含Interface.h?由于您在Interface.h 中包含MainForm.h,因此您也可以在包含Interface.h 的任何位置间接包含它。也许你应该只将它包含在Interface.cpp 中并在Interface.h 中使用前向声明 哇哦,原来如此!我在Interface.h 中包含MainForm.h 而不是Interface.cpp。这在教程中没有提到,但是当你考虑它时它是合乎逻辑的......非常感谢。请将此作为答案发布,以便我接受并投票。 ;) 【参考方案1】:

您在哪里包括MainForm.h - 直接和间接? 如果您在Interface.h 中包含MainForm.h,您也可以在包含Interface.h 的任何位置间接包含它。这意味着,如果您随后将Interface.h 包含在任何未使用/clr 编译的翻译单元(即*.cpp)中,那么编译器当然会抱怨它,因为namespace Systemgcnew 不是一部分标准 C++。

因此,您应该只在Interface.cpp 中包含MainForm.h,并在Interface.h 中使用前向声明。

【讨论】:

以上是关于窗体头文件中的“错误 C2653:系统不是类或命名空间名称”,Visual C++的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何跟C#一样弄个窗体出来,并加入按钮之类的控件

简单的GTK窗体搭建

qt自定义的函数怎么调用mainwindow

请问在Delphi里如何从一个窗体调用另一个窗体?

✥2-GUI应用程序设计基础

✥2-GUI应用程序设计基础