如果我有一些代码
main(int argc, char *argv[])
{
...
#include "Class1.H"
#include "Class2.H"
...
}
通常 main() 方法是每个应用程序的起点,而 main() 中的内容将被执行。我是否正确假设 main() 中包含的所有类的内容将在 main() 启动时执行?
问候街
不,不,不。
首先,您不是#include
函数中的文件。你#include
一个文件在一个文件的开头,在其他声明之前。好的,你可以在任何地方使用#include
,但你真的不应该。
其次,#include
不执行任何操作。它基本上只是一个复制粘贴操作。d 文件的内容#include
(有效地)插入到您放置#include
.
第三,如果您要学习 C++ 编程,请考虑选择我们推荐的一本教材。
你评论说:
我正在使用 OpenFoam 中的 multiphaseEulerFoam Solver,并且在 multiphaseEulerFoam.C 的 main() 中包含了类。我假设这些类具有在 main() 中调用的正确结构
情况可能是这样,我不怀疑这些类具有正确的结构,可以从main
. 问题是main
在 s 之后格式错误,#include
因为您将拥有本地类定义并且谁知道main
.
考虑一下。如果你有一个标题:
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Foo (const std::string& val)
:
mVal (val)
{
}
private:
std::string mVal;
};
#endif
您尝试将其包含在 main 中:
int main()
{
#include "foo.h"
}
预处理#include
指令后,编译器将尝试编译的结果文件将如下所示:
int main()
{
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Foo (const std::string& val)
:
mVal (val)
{
}
private:
std::string mVal;
};
#endif
}
这是各种各样的错误。一,你不能像这样声明本地类。二,Foo
不会像你想象的那样被“执行”。
main.cpp 应该是这样的:
#include "foo.h"
int main()
{
}
#define
并且#include
只是在'preprocessing'
编译阶段发生的文本操作,这在技术上是一个可选阶段。因此,您可以以各种方式混合和匹配它们,只要您的预处理器语法正确,它就可以工作。
但是,如果您确实使用#undef
代码重新定义宏,将很难遵循,因为相同的文本在代码的不同位置可能具有不同的含义。
对于自定义类型,在可能的情况下,最好使用 typedef,因为您仍然可以从编译器的类型检查机制中受益,并且它不易出错,因为它比#define
宏不太可能对周围的代码产生意外的副作用。
Jim Blacklers 回答@ #include inside main() 函数
尽量避免这样的代码。#include
指令在其位置插入文件的内容。您可以通过在主函数中复制粘贴 Class1.H 和 Class2.H 中的文件内容来模拟代码的结果。
包含不属于任何函数或类方法体,这不是一个好主意。除非您在头文件中实例化您的类之一,否则不会执行任何代码。
代码在以下情况下执行:
试试这个例子:
#include <iostream>
using namespace std;
int main()
{
class A
{ public:
A() { cout << "A constructor called" << endl; }
};
// A has no instances
class B
{ public:
B() { cout << "B constructor called" << endl; }
void test() { cout << "B test called" << endl; }
} bbb;
// bbb will be new class instance of B
bbb.test(); // example call of test method of bbb instance
B ccc; // another class instance of B
ccc.test(); // another call, this time of ccc instance
}
当你运行它时,你会观察到:
test
,然后调用它。这是一个 openFoam 语法,他说 open Foam#include
就像调用函数一样是正确的。在 OpenFoam 中,使用#include Foo.H
将贯穿代码而不是在不同层次结构级别中完成的类声明。我建议不要在 C++ 论坛中提出所有与 openFoam 相关的问题,因为 openFoam 中的 C++ 内置了很多东西,因此需要打破规则才能生成工作代码。
你只包括类的声明。要执行他们的代码,您需要创建类实例(对象)。
此外,您不应该#include
在函数或类方法中编写代码。通常它不会编译。