所谓 #include 的意思呢,就是把另一个文件里的东西复制到这里来,无论你的文件后缀是 h 还是 cpp 都是一样的。
如果#include了一个cpp,同时又把这个cpp包含到工程,链接时就会出现重定义错误。错误是怎么产生的呢?你可以试试写 a.cpp 和 b.cpp 两个文件,两个文件中有一模一样的两个函数,是不是产生了和你的问题中同样的错误?因为你有两个一模一样的函数,编译器不知道怎么区分它们了。
现在把 a.cpp 中的内容全部去掉,换成 #include "b.cpp",VC在编译的时候,首先将 #include "b.cpp" 替换成了 b.cpp 的内容,于是就和刚才的情形一致了。这时再进行编译,当然就会出一样的错误了。
现在,假设你有很多个函数,并且有很多个 .cpp 文件要用到它们,那么,岂不是需要在每个文件中写上一大堆的声明?这便是 #include 的用武之地了。在一个 .h 文件写上所有的声明,然后在每个 .cpp 文件中 #include 它,于是编译器就会把 #include "xx.h" 替换成 xx.h 文件中的实际内容,于是你的每个 .cpp 文件中都有这些声明了,都可以自由地使用这些函数了。
如果#include了一个cpp,同时又把这个cpp包含到工程,链接时就会出现重定义错误。错误是怎么产生的呢?你可以试试写 a.cpp 和 b.cpp 两个文件,两个文件中有一模一样的两个函数,是不是产生了和你的问题中同样的错误?因为你有两个一模一样的函数,编译器不知道怎么区分它们了。
现在把 a.cpp 中的内容全部去掉,换成 #include "b.cpp",VC在编译的时候,首先将 #include "b.cpp" 替换成了 b.cpp 的内容,于是就和刚才的情形一致了。这时再进行编译,当然就会出一样的错误了。
那么 .h 文件为什么没有类似的问题呢?
一是 .h 文件并没有定义,都是一些声明,声明可以重复多次(你只是在告诉编译器,工程中有这么个东西,具体在哪,请到别处找找),而定义不行。二是 VC 并不会编译 .h 文件,如果你把项目中的 .h 文件全部移除(不是删除!),程序照样可以编译。
如果你要调用另一个 .cpp 文件中的函数,只要在使用它的文件中声明一下就可以了。比如:"int Foo( int a, int b );"(注意没有函数体) 这个声明告诉编译器你要一个名叫 Foo, 接受两个整型参数,返回整型的函数,编译器自动会帮你去找。只要项目中任一个 .cpp 文件定义了这样一个函数,编译器就可以找到。现在,假设你有很多个函数,并且有很多个 .cpp 文件要用到它们,那么,岂不是需要在每个文件中写上一大堆的声明?这便是 #include 的用武之地了。在一个 .h 文件写上所有的声明,然后在每个 .cpp 文件中 #include 它,于是编译器就会把 #include "xx.h" 替换成 xx.h 文件中的实际内容,于是你的每个 .cpp 文件中都有这些声明了,都可以自由地使用这些函数了。