在很多书上都教了#include包含头文件,但是没有教为什么不能包含源文件。。。所以有一些同学试过直接包含源文件(好吧,我承认,我在大学时候也这样做过,而且很幸运没有出问题)。

  那到底应不应该包含源文件呢?

  我想用一个反证法,如果直接包含.cpp文件,那cpp文件中的static变量和接口不是全暴露给外部的.cpp文件了吗,那样要static和接口的在本文件生命周期有效这一个限定有毛用?不直接包含源文件,就可以把程序按照文件进行模块划分。(可能很多同学说,总是说模块化,就知道吹这些名词,都不感觉到它有什么用,呃,还是那句话,是你写的程序太少了)当然这个模块化的好处诱惑不到你的话,那不给你编译,这下你没话说了吧。看下面例子,这样直接包含.cpp文件的做法会很容易造成重复定义的错误。

  还是原来的那个程序作为例子吧。

  person.h文件

 1 #ifndef _Person_H
 2  #define _Person_H
 3
 4 class Person
 5  {
 6 public:
 7      Person();
 8
 9     ~Person();
10
11  private:
12  };
13
14  #endif

  person.cpp文件

 1 #include <iostream>
 2 #include "person.h"
 3
 4 using std::cout;
 5 using std::endl;
 6
 7 Person::Person()
 8 {
 9     cout << "create a person" << endl;
10 }
11
12 Person::~Person()
13 {
14     cout << "release a person" << endl;
15 }

   main.cpp文件

1 #include <iostream>
2 #include "person.h"
3 using namespace std;
4
5 int main()
6 {
7     Person person;
8     return 0;
9 }

  OK!这样是“正常人”的写法,哈哈,是不会出问题的。不过,还是看一下运行结果吧。

   但是如果直接#include包含".cpp"文件呢,会出现什么结果。看下面例子。

  main.cpp文件直接包含person.cpp文件:

 1 #include <iostream>
 2 #include "person.cpp"
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     Person person;
 9     return 0;
10 }

  编译运行:

   出现了多重定义导致不能编译。

  综上,不建议直接包含.cpp文件,即使有多不得已的理由,都不应该这样写,比如有人说一个.cpp程序内容太长,用这样方法扩展程序(有这个说法人,你应该重新设计程序划分程序模块了),或者说提高编译效率(扯蛋啊,能不能提高编译效率另说,反正现在的计算机不差这点编译时间,难道用的是七八十年代的机器吗)。

01-22 07:04
查看更多