如果我有一些代码,比如
main(int argc, char *argv[])
{
...
#include "Class1.H"
#include "Class2.H"
...
}
通常,main() 方法是每个应用程序的起点,并且要执行 main() 中的内容。我假设 main() 中包含的所有类的内容将在启动 main() 时执行,我是否正确?
问候斯特莱特
不,不,不。
首先,您不会在函数中#include
文件。 在文件开头、其他声明之前#include
文件。 好的,你可以在任何地方使用#include
,但你真的不应该。
其次,#include
不执行任何内容。 它基本上只是一个复制粘贴操作。 #include
d文件的内容(有效地)准确地插入到您放置#include
的位置。
第三,如果你要学习用C++编程,请考虑选择我们推荐的文本之一。
你评论说:
我正在使用OpenFoam中的多相欧拉泡沫求解器,并且 在多相欧拉泡沫.C 的 main() 中包含了类。我 假设类具有要调用的正确结构 主()
可能是这种情况,我不怀疑这些类具有从main
调用的正确结构。 问题是main
在#include
之后会格式不正确,因为您将拥有本地类定义,谁知道main
中还有什么。
考虑一下。 如果您有标头:
福.H
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Foo (const std::string& val)
:
mVal (val)
{
}
private:
std::string mVal;
};
#endif
你试着把它包含在主要:
主.cpp
int main()
{
#include "foo.h"
}
预处理 #include
指令后,编译器将尝试编译的结果文件将如下所示:
预处理的主.cpp
int main()
{
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Foo (const std::string& val)
:
mVal (val)
{
}
private:
std::string mVal;
};
#endif
}
这是各种错误。第一,你不能像这样声明本地类。 第二,Foo
不会像你假设的那样被"执行"。
主.cpp 应如下所示:
#include "foo.h"
int main()
{
}
#define
和#include
只是在编译的'preprocessing'
阶段(技术上是一个可选阶段)发生的文本操作。因此,您可以通过各种方式混合和匹配它们,只要您的预处理器语法正确,它就会起作用。
但是,如果您确实使用#undef
重新定义宏,则代码将难以理解,因为相同的文本在代码的不同位置可能具有不同的含义。
对于自定义类型,typedef 在可能的情况下更受欢迎,因为您仍然可以从编译器的类型检查机制中受益,并且它不太容易出错,因为它比#define
宏对周围代码产生意外副作用的可能性要小得多。
吉姆·布莱克勒斯 在主()函数内回答@#include
尽量避免这样的代码。 #include
指令将文件的内容插入其位置。您可以通过在 main 函数中复制粘贴来自 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
}
当您运行它时,您会观察到:
- 不会创建类 A 的实例。A类不会运行任何内容。
- 如果您初始化 BBB 和 CCC,它们的构造函数将被运行。要运行任何其他代码,您必须首先创建一个方法,例如
test
然后调用它。
这是一个 openFoam 语法,他说 open Foam 对待#include
就像调用函数一样是正确的。 在OpenFoam中,使用#include Foo.H
将运行代码,而不是在不同的层次结构级别中完成的类声明。我建议不要在C++论坛上提出所有与openFoam相关的问题,因为在openFoam中有很多东西内置C++,需要打破规则才能生成工作代码。
你只包含类的声明。要执行其代码,您需要创建类实例(对象)。
此外,不应在函数或类方法中编写#include
。通常情况下,它不会编译。