(http://blog.163.com/yui_program/blog/static/18415541520115177852896/)函数
1、源文件如何根据#include来关联头文件ui
1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。spa
2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,而后在到C++安装目录(好比VC中能够指定和修改库文件查找路径,Unix和Linux中能够经过环境变量来设定)中查找,最后在系统文件中查找。.net
#include “"xxx.h”(我一直觉得””和<>没什么区别,可是tinyxml.h是非系统下的都文件,因此要用””)命令行
2、头文件如何来关联源文件设计
这个问题其实是说,已知头文件“a.h”声明了一系列函数,“b.cpp”中实现了这些函数,那么若是我想在“c.cpp”中使用“a.h”中声明的这些在“b.cpp”中实现的函数,一般都是在“c.cpp”中使用#include “a.h”,那么c.cpp是怎样找到b.cpp中的实现呢?xml
其实.cpp和.h文件名称没有任何直接关系,不少编译器均可以接受其余扩展名。好比偶如今看到偶们公司的源代码,.cpp文件由.cc文件替代了。blog
在Turbo C中,采用命令行方式进行编译,命令行参数为文件的名称,默认的是.cpp和.h,可是也能够自定义为.xxx等等。get
谭浩强老师的《C程序设计》一书中提到,编译器预处理时,要对#include命令进行“文件包含处理”:将file2.c的所有内容复制到#include “file2.c”处。这也正说明了,为何不少编译器并不care到底这个文件的后缀名是什么----由于#include预处理就是完成了一个“复制并插入代码”的工做。编译器
编译的时候,并不会去找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中指定的那个能够执行文件中。
在Unix下,甚至能够不在源文件中包括头文件,只须要在makefile中指名便可(不过这样大大下降了程序可读性,是个很差的习惯哦^_^)。在VC中,一帮状况下不须要本身写makefile,只须要将须要的文件都包括在project中,VC会自动帮你把makefile写好。
一般,编译器会在每一个.o或.obj文件中都去找一下所须要的符号,而不是只在某个文件中找或者说找到一个就不找了。所以,若是在几个不一样文件中实现了同一个函数,或者定义了同一个全局变量,连接的时候就会提示“redefined”。
内部链接和外部链接:
编译时每一个文件会被编译成一个含有必要信息的源文件(又叫编译单元),而后编译单元会联结成一个和主文件同名的.o文件,.o文件把不一样的编译单元中产生的符号联系起来,构成一个可执行文件。有两种大相径庭的连接:内部的和外部的,将这些编译单元联系起来。
内部链接:对这个定义的访问被局限在当前编译单元,其余编译单元没法访问。
外部链接:可被其余单元访问,所以名称在整个执行文件中必须惟一。
类的定义(同时也是声明),enum,struct,都是内部链接,内联函数,静态的非类成员数据也是
typedef声明的类型也是内联结。
非内联成员函数(包括静态成员)有外部链接,非内联函数,非静态自由函数(非类的成员函数)也是外链接。
声明只对当前编译单元有用,他们不会影响到.o文件
.h文件,因为该文件会被其余.cpp文件包含,但因为声明只是对当前编译单元有效,是不会将符号引入.o文件,因此该文件不能含有任何外部链接的符号(数据成员和函数)的定义。通常状况下也不要包含内链接符号的定义。
综上所诉:
.h文件中能包含:
1。类成员数据的声明,但不能赋值
2.类静态数据成员的定义和赋值,但不建议,只是个声明就好。
3。类的成员函数的声明
4。非类成员函数的声明
5.常数的定义:如:const int a=5;
6.静态函数的定义
7.类的内联函数的定义
不能包含:
1. 全部非静态变量(不是类的数据成员)的声明
2。 默认命名空间声明不要放在头文件,using namespace std;等应放在.cpp中,在.h文件中使用std::string
http://blog.csdn.net/pjw100/archive/2010/01/18/5208879.aspx
----------------------------------------------------------------------------------------------------------------------
编译器无论头文件的,头文件只是用来被cpp文件包含的,被包含以后,它就成了那个cpp文件的一部分了,而编译器只编译.cpp文件,不会去单独编译一个头文件的。编译器这样作以后,针对每一个编译过的cpp文件生成一个obj文件。而后链接器把全部这些obj文件链接成一个程序,或能是exe或dll(或作成静态的lib)。若是在链接的过程当中,有些实体(好比变量或函数)找不到定义,则会报link错误。
咱们一般把类的定义都放在头文件,而其成员函数以及静态成员变量的定义都放在一个主名相同,扩展名不一样的cpp文件——这只是一种风格和传统,而不是C++语言规定的。
若是你不嫌乱,你固然能够把全部的代码都放到一个cpp文件中,整个工程就一个源文件。
你也能够把一个类的10个函数分别在10个不一样的cpp文件中实现,甚至有4个实如今cpp文件中,另外3个是打包在之前作好的静态库(lib)中,还有3个内联定义在头文件中——都没问题。只要每一个cpp文件都能顺利经过编译,并且链接器在链接时都能找到这些定义就OK了。