vc++当插入一个类的时候
是(自动)将类的声明放在一个.h中
具体函数的实现放在.cpp中、而不是全放在.h中
1.
从语法上来讲
:
头文件里面可以包含:对象声明,
const
对象定义,函数声明,
inline
函数定义,
class
定义,
inline class member function
定义,预处理命令,头文件包含
头文件通用性更强(一般放进头文件中的各种语法或语义,至少在一个小范围内具有一定的通用性),可以适合多种目的不同的源文件包含。
但随之而来的是源文件在包含头文件时,记得千万避免包含上的冲突,比如标准库中带
.h
和不带
.h
为例。
2.
从使用的角度讲:
源文件可以包含头文件,但是头文件不可以包含源文件。后者虽然在语法上是允许的,但是实际使用
中是不规范的用法。
3.
从预处理的角度讲:
对于一个包含了多个头文件的源文件,只要用头文件的内容替换掉源文件中的对应的
include
语句,就可以得到预处理后的源文件。这个最终生成的源文件的编译结果就是最终的编译结果。
4.
从编译的角度讲:
源文件被直接编译,也就是说源文件将直接被编译为
obj
文件。而头文件如果没有被任何源文件包含的话,将不会被编译。换句话说,如果一个头文件没有被任何源文件直接或者间接包含的话,那么这个头文件中即使有语法错误也不会在编译时被检测出来。
成员函数在不在头文件中定义,其实都没多大关系,但如果你的程序是提供给别人作为库,而在头文件中定义成员函数,别人就会看到你程序的实现,在.cpp中定义,人家使用时调用的是库文件,看到的只是你的头文件中的声明,而不知道你是怎么实现的(呵呵,商业机密).
还有一些规则是,有些成员函数是必须在类声明中定义的,如类的静态成员函数,inline函数.
如果函数在头文件中定义(假设这个头文件叫a.h),那么当这个函数有改动时,所有包含了a.h文件的.cpp文件将全部需要被重建,如果这个头文件被多次引用的话,带来的副作用将非常的大。
但如果函数不在.h中定义的话,则改动带来的副作用将小得多,只有当前改动的文件从新编译一下即可了
成员函数一般是不可以在头文件中定义的,只能在头文件中声明。因为函数只能有一次定义,而可以有多次声明,当头文件被多次包含的时候,如果头文件中有函数定义就违背了这个原则~
所以,成员函数一般都在头文件中声明,而在源文件中定义
已知头文件
“a.h”
声明了一系列函数,
“b.cpp”
中实现了这些函数,那么如果我想在
“c.cpp”
中使用
“a.h”
中声明的这些在
“b.cpp”
中实现的函数,通常都是在
“c.cpp”
中使用
#include “a.h”,
那么
c.cpp
是怎样找到
b.cpp
中的实现呢?
编译的时候,并不会去找
b.cpp
文件中的函数实现,只有在
link
的时候才进行这个工作。我们在
b.cpp
或
c.cpp
中用
#include “a.h”
实际上是引入相关声明,使得编译可以通过,程序并不关心实现是在哪里,是怎么实现的。源文件编译后成生了目标文件(
.o
或
.obj
文件),目标文件中,这些函数和变量就视作一个个符号。在
link
的时候,需要在
makefile
里面说明需要连接哪个
.o
或
.obj
文件(在这里是
b.cpp
生成的
.o
或
.obj
文件),此时,连接器会去这个
.o
或
.obj
文件中找在
b.cpp
中实现的函数,再把他们
build
到
makefile
中指定的那个可以执行文件中。