如果我有一些像
这样的代码 main(int argc, char *argv[])
{
...
#include "Class1.H"
#include "Class2.H"
...
}
通常,main()方法是每个应用程序的起点,main()中的内容将被执行。我是否正确假设main()中包含的所有类的内容将在main()启动时执行?
问候 Streight
答案 0 :(得分:8)
不,不,否。
首先,您没有#include
函数中的文件。在其他声明之前,您#include
文件开头的文件。好的,你可以在任何地方使用#include
,但你真的不应该。
其次,#include
不会执行任何事情。它基本上只是一个复制粘贴操作。 #include
d文件的内容(有效)插入到#include
的确切位置。
第三,如果您要学习使用C ++编程,请考虑选择我们的recommended texts。
您评论道:
我正在使用OpenFoam中的multiphaseEulerFoam Solver和 在multiphaseEulerFoam.C的main()内部是包含的类。一世 假设类具有要调用的正确结构 main()的
可能是这种情况,我不怀疑这些类具有从main
调用的正确结构。问题是main
在#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()
{
}
答案 1 :(得分:4)
#define
和#include
只是在'preprocessing'
编译阶段发生的文本操作,从技术上讲,这是一个可选阶段。因此,您可以通过各种方式混合和匹配它们,只要您的预处理器语法正确,它就可以工作。
但是,如果您使用#undef
重新定义宏,则代码将难以遵循,因为相同的文本在代码中的不同位置可能具有不同的含义。
对于自定义类型,typedf在可能的情况下是首选,因为您仍然可以从编译器的类型检查机制中受益,并且它不易出错,因为它比#define
宏更不可能有意外的一面 - 对周围代码的影响。
Jim Blacklers回答@ #include inside the main () function
答案 2 :(得分:3)
尽量避免这样的代码。 #include
指令在其位置插入文件的内容。
您可以通过在主函数内复制粘贴Class1.H和Class2.H中的文件内容来模拟代码的结果。
答案 3 :(得分:2)
包含不属于任何函数或类方法体,这不是一个好主意。 除非您在头文件中实例化其中一个类,否则不会执行任何代码。
代码在以下时间执行:
试试这个例子:
#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
,然后调用它。答案 4 :(得分:1)
这是一个openFoam语法,他说开放式Foam会像调用函数一样对待#include
。在使用#include Foo.H
的OpenFoam中,将运行代码而不是在不同层次结构级别中完成的类声明。我建议不要在C ++论坛中询问所有与openFoam相关的问题,因为在openFoam中有很多内容构建到C ++上,需要打破很多规则才能生成一个有效的代码。
答案 5 :(得分:0)
您只包括类的声明。要执行其代码,您需要创建类实例(对象)。
另外,你不应该在函数或类方法中写#include
。它往往不会编译。