1

如果我有一些代码

    main(int argc, char *argv[])
{
...
#include "Class1.H"
#include "Class2.H"
...

}

通常 main() 方法是每个应用程序的起点,而 main() 中的内容将被执行。我是否正确假设 main() 中包含的所有类的内容将在 main() 启动时执行?

问候街

4

6 回答 6

8

不,不,

首先,您不是#include函数中的文件。你#include一个文件在一个文件的开头,在其他声明之前。好的,你可以在任何地方使用#include,但你真的不应该。

其次,#include执行任何操作。它基本上只是一个复制粘贴操作。d 文件的内容#include(有效地)插入到您放置#include.

第三,如果您要学习 C++ 编程,请考虑选择我们推荐的一本教材


你评论说:

我正在使用 OpenFoam 中的 multiphaseEulerFoam Solver,并且在 multiphaseEulerFoam.C 的 main() 中包含了类。我假设这些类具有在 main() 中调用的正确结构

情况可能是这样,我不怀疑这些类具有正确的结构,可以从main. 问题是main在 s 之后格式错误,#include因为您将拥有本地类定义并且谁知道main.

考虑一下。如果你有一个标题:

foo.h

#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指令后,编译器将尝试编译的结果文件将如下所示:

预处理的 main.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不会像你想象的那样被“执行”。

main.cpp 应该是这样的:

#include "foo.h"

int main()
{
}
于 2013-10-31T12:57:20.910 回答
4

#define并且#include只是在'preprocessing'编译阶段发生的文本操作,这在技术上是一个可选阶段。因此,您可以以各种方式混合和匹配它们,只要您的预处理器语法正确,它就可以工作。

但是,如果您确实使用#undef代码重新定义宏,将很难遵循,因为相同的文本在代码的不同位置可能具有不同的含义。

对于自定义类型,在可能的情况下,最好使用 typedef,因为您仍然可以从编译器的类型检查机制中受益,并且它不易出错,因为它比#define宏不太可能对周围的代码产生意外的副作用。

Jim Blacklers 回答@ #include inside main() 函数

于 2013-10-31T13:04:59.053 回答
3

尽量避免这样的代码。#include指令在其位置插入文件的内容。您可以通过在主函数中复制粘贴 Class1.H 和 Class2.H 中的文件内容来模拟代码的结果。

于 2013-10-31T12:56:54.807 回答
2

包含不属于任何函数或类方法体,这不是一个好主意。除非您在头文件中实例化您的类之一,否则不会执行任何代码。

代码在以下情况下执行:

  1. 实例化类,然后调用它的构造方法并执行方法中的代码。
  2. 如果在你的实例化类中有一个类类型的变量,它们也会运行它们的构造函数。
  3. 当你调用一个类方法时。

试试这个例子:

#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
}

当你运行它时,你会观察到:

  1. 将不会创建 A 类的实例。A类不会运行任何东西。
  2. 如果你实例化 bbb 和 ccc,它们的构造函数将被运行。要运行任何其他代码,您必须首先创建一个方法,例如test,然后调用它。
于 2013-10-31T12:55:13.170 回答
1

这是一个 openFoam 语法,他说 open Foam#include就像调用函数一样是正确的。在 OpenFoam 中,使用#include Foo.H将贯穿代码而不是在不同层次结构级别中完成的类声明。我建议不要在 C++ 论坛中提出所有与 openFoam 相关的问题,因为 openFoam 中的 C++ 内置了很多东西,因此需要打破规则才能生成工作代码。

于 2014-09-09T12:45:50.793 回答
0

你只包括类的声明。要执行他们的代码,您需要创建类实例(对象)。

此外,您不应该#include在函数或类方法中编写代码。通常它不会编译。

于 2013-10-31T12:55:41.557 回答