为什么这个标题编译时缺少#include?

时间:2013-11-03 03:56:09

标签: c++

Person.h

#ifndef PERSON_H_
#define PERSON_H_

/* Person.h */

class Person {
  int age;
  std::string name;

  public:
    Person(int, std::string);
    std::string getName();
    int getAge();

};

#endif /* PERSON_H_ */

person(int std :: string)函数声明使用std :: string名称,但我没有将它包含在头文件中。因此,我希望编译器抱怨丢失的符号。然而它编译并运行良好!为什么呢?

剩下的代码......

Person.cpp

#include <string>
#include "Person.h"

Person::Person(int age, std::string name)
{
  this->name = name;
  this->age = age;
}

std::string Person::getName()
{
  return this->name;
}

int Person::getAge()
{
  return this->age;
}

Main.cpp的

#include <string>
#include "Person.h"

int main() {

  printFunc();

  Person chelsea_manning(5, std::string("Chelsea Manning"));

}

另外,我是C ++的新手,所以如果你看到我的代码/ OOP有什么奇怪的话,请告诉我。

1 个答案:

答案 0 :(得分:4)

程序的编译从包含main函数的文件的顶部开始(从技术上讲,预编译器在编译程序之前运行,但它仍然在同一个地方启动)。在您的情况下,它首先做的是将<string>包含在该文件中。然后它包括Person.h。由于已经包含<string>,因此字符串文件的所有内容都位于代码中的person文件之前,并且所有内容都以正确的顺序声明。如果您要在Person.h之前添加<string>,或者不包含在主文件中,则确实会收到编译错误。

#include方向就像复制/粘贴一样:它从字面上读取<string>文件,并将其内容发送到其中包含的源文件中。接下来,对Person.h做同样的事情。因此运行预处理器后的最终结果是

<-- contents of <string> -->
<-- contents of Person.h -->

int main()
...

因此,在您的示例中,所有内容都以正确的顺序声明。