令人头痛的Header Files和Source Files

 
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 中指定的那个可以执行文件中。
 

你可能感兴趣的:(令人头痛的Header Files和Source Files)