main()方法中包含的类

时间:2013-10-31 12:51:56

标签: c++ class include main

如果我有一些像

这样的代码
    main(int argc, char *argv[])
{
...
#include "Class1.H"
#include "Class2.H"
...

}

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

问候 Streight

6 个答案:

答案 0 :(得分:8)

不,不,

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

其次,#include不会执行任何事情。它基本上只是一个复制粘贴操作。 #include d文件的内容(有效)插入到#include的确切位置。

第三,如果您要学习使用C ++编程,请考虑选择我们的recommended texts


您评论道:

  

我正在使用OpenFoam中的multiphaseEulerFoam Solver和   在multiphaseEulerFoam.C的main()内部是包含的类。一世   假设类具有要调用的正确结构   main()的

可能是这种情况,我不怀疑这些类具有从main调用的正确结构。问题是main#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中:

的main.cpp

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()
{
}

答案 1 :(得分:4)

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

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

对于自定义类型,typedf在可能的情况下是首选,因为您仍然可以从编译器的类型检查机制中受益,并且它不易出错,因为它比#define宏更不可能有意外的一面 - 对周围代码的影响。

Jim Blacklers回答@ #include inside the main () function

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

代码在以下时间执行:

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

    #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,然后调用它。

答案 4 :(得分:1)

这是一个openFoam语法,他说开放式Foam会像调用函数一样对待#include。在使用#include Foo.H的OpenFoam中,将运行代码而不是在不同层次结构级别中完成的类声明。我建议不要在C ++论坛中询问所有与openFoam相关的问题,因为在openFoam中有很多内容构建到C ++上,需要打破很多规则才能生成一个有效的代码。

答案 5 :(得分:0)

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

另外,你不应该在函数或类方法中写#include。它往往不会编译。