1、头文件

转 html

http://www.cnblogs.com/BlogNetSpace/archive/2009/02/12/1388943.htmlc++

http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042编程

http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/headers/设计模式

目录:ide

一、头文件的include两个格式函数

二、头文件的条件编译ui

三、头文件依赖:前置声明this

四、头文件包含类容google

 

 

一、头文件的include两个格式spa

1.一、#include <....h> 这种格式用来引用标准库的头文件,编译器默认从标准库开始搜索

1.二、#include "......h" 这种格式用来引用非标准库的头文件,编译器默认从工程当前目录开始搜索

二、头文件#define保护。即全部头文件应该使用#define进行保护,防止头文件被多重包含。就涉及到条件编译:

#ifndef, #def, #endif,#ifdef,#define

2.一、条件编译命令

#ifdef MY_HEADER_H    // 若是定义了MY_HEADER_H,就编译程序段1

程序段1;

#else //不然就编译程序段2

程序段2;

#endif

#else 部分也能够没有:

#ifdef

code1;

#endif

这个也能够用在某些功能文件未实现以前和实现以后使用这个条件编译命令起到开关功能。也能够用在调试功能上。在调试阶段须要输出一些类容,不是调试阶段就不输出。固然在调试的时候定义

#define DEBUG 1 或者 #define DEBUG 0

这样在调试以前加这一句,就能够在调试的时候输出cout的内容,当不须要调试的时候,就将这个#define语句删掉,这样,就能正常执行程序的功能,不用输出调试语句,这个很方便,就不用本身去删掉或注释掉较多的输出语句。不错的功能

#ifdef DEBUG

cout<<"the debug phase"<<endl;

#endif

 

2.二、另一种跟1比较类似,可是是反着的。

#ifndef DEBUG

code1;

#else 

code2;

#endif

解释:相对ifdef来讲,中间多了一个n,表示没有。就是若是没有定义DEBUG,编译code1,不然编译coude2

#ifndef MY_HEADER_H

#define MY_HEADER_H

.....

....

....

...

...

#endif

这个是为了防止MY_HEADER_H被重复包含。全部头文件都应该使用 #define 防止头文件被多重包含

2.三、另一种形式,也能够用到code里面,就是code里面嵌入这个条件编译,这样就不用编译所有:

#if 表达式

code1;

#else

code2;

#endif

表示若是表达式为真,就编译code1,不然编译code2.

 

 

3 头文件依赖

对于头文件依赖,能用前置声明的尽可能不使用#include。又涉及到了前置声明

3.1 前置声明(前向声明):

class Screen;

在程序中引入类类型,在声明以后,定义以前,类是一个不彻底类型,即知道该类是一个类型,可是并不知道包含哪些成员。只能以有限的方式使用。只要类名一出现,就认为该类已经声明。

class B;
class A{

    public:
        B  *b;
};

class B{
public:
    ....;
    ....;
};

对于B来讲,就是一个前置声明,A要用到B,可是B不在A以前定义,A要使用B就要先声明B。

  • 不彻底类型不能定义该类型的对象
  • 只能用于定义该类型的指针或者引用
  • 或者用于声明(不是定义)使用该类型做为行参类型或返回类型的函数
  • 在使用类的对象以前,必定要定义该类。这样,编译器就会给该类预约相应的存储空间。
  • 在使用引用或者指针访问类的成员以前,必须定义类

转 

http://blog.csdn.net/raodotcong/article/details/6431502

http://patmusing.blog.163.com/blog/static/135834960201038113714199/

第一个博客里面写的是:类h文件引用其余文件的类的时候,能够不用引入头文件,直接先声明须要引用的类名,而是在类实现文件里面引用其余类的h文件。这样就避免了一个头文件包含了其余的头文件,减小了这个文件对其余头文件的依赖。由于若是一个头文件改变,就会致使全部包含这个头文件的代码被从新编译。因此尽可能在头文件少包含其余的头文件,能够选择在cpp文件里面包含其余的头文件,由于在cpp文件里面须要引用到其余类定义的成员,这个时候就必须先进行引用其余类的头文件。只是在实现文件cpp文件里面包含其余的头文件是比较好的编程风格。

包含:若是你的类是其余类的子类, 或者含有类型为其余类的非静态数据成员(对象), 则必须包含其余类所在的头文件. 

 

四、头文件包含类容

头文件通常包含类的声明,extern变量的声明和函数的声明。

定义只有一次,声明能够屡次。

4.1 头文件用于声明,而不是用于定义

extern int ival = 10;//初始化,为定义

double fica;//没有extern,也是一个定义

没有extern,同一个程序中两个以上文件含有上述任一个定义都会连接错误。

由于头文件包含在多个源文件,因此不该该含有变量或函数的定义。

较好的:extern double fical;

头文件能够包含:定义类,值在编译的时候就知道value的const对象,inline函数。

 

4.2 一些const对象定义在头文件中

若是const变量是由常量表达式初始化,就定义在头文件,若是不是,就不要放头文件,同时在以前加上extern以便其余文件共享。

 

4.3 头文件中能够包括:用户构造的数据类型(如枚举类型),外部变量,外部函数、常量和内联函数等具备必定通用性或经常使用的量。
而通常性的变量和函数定义不宜放在头文件中。

头文件用于声明,而不用于定义。定义只能够出现一次,而声明能够出现屡次。由于头文件被设计用来包含在多个源文件中,因此不该该含有变量或者函数的定义。
下列语句是定义,因此不该该放在头文件里: 
Extern int ival = 10;           //有初始化,因此是定义
Double fica_rate;               //没有extern关键字,因此也是定义
 (下面这三段转的:http://blog.163.com/cindy_19810217/blog/static/201059118201391035246899/)
对于头文件不该该含有定义这一规则,有三个例外:类定义、枚举的定义、值在编译时就已知的,const对象、inline函数。const对象(变量)默认是定义该变量的文件的局部变量,链接类型为内链接。每一个包含该头文件的源文件都有了本身的const变量,都为它分配的存储空间,其名称和值都同样。若是const变量不是用常量表达式初始化的,那么它就不该该在头文件中定义。它应该和其余的变量同样,应该定义在一个源文件中并初始化,在头文件中为它添加extern声明,以便被多个文件共享。
 
内链接:类定义、全局常量、const对象(变量)、typedef类型、宏定义 默认为内链接的。另外,定义时被显示加上static关键字的全局变量和全局函数,具备文件做用据,链接类型也为内链接。默认为内链接的标识符,若是显示加上extern关键字,即变成外链接。
 
外链接:全局变量、全局函数默认是外链接的。

(下面的图片时转的:http://blog.sina.com.cn/s/blog_6db80bb101013ute.html)

转:http://www.weixueyuan.net/view/5834.html

 

 

总结:(C++primer:c++是一种静态类型语言:变量和函数在使用前必须先声明。变量能够声明屡次可是只能定义一次)

转的总结:http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/headers/

  1. 避免多重包含是学编程时最基本的要求;
  2. 前置声明是为了下降编译依赖,防止修改一个头文件引起多米诺效应;
  3. 内联函数的合理使用可提升代码执行效率;
  4. -inl.h 可提升代码可读性 (通常用不到吧:D);
  5. 标准化函数参数顺序能够提升可读性和易维护性 (对函数参数的堆栈空间有轻微影响, 我之前大可能是相同类型放在一块儿);
  6. 包含文件的名称使用 . 和 .. 虽然方便却易混乱, 使用比较完整的项目路径看上去很清晰, 很条理, 包含文件的次序除了美观以外, 最重要的是能够减小隐藏依赖, 使每一个头文件在 “最须要编译” (对应源文件处 :D) 的地方编译, 有人提出库文件放在最后, 这样出错先是项目内的文件, 头文件都放在对应源文件的最前面, 这一点足以保证内部错误的及时发现了。

下面时之后要概括的一些东西,一一写下来:

const专题,static, extern专题,class和struct区别专题,指针专题,读写文件专题,string专题,虚函数专题(涉及到重载,覆盖(至关于重写)),内联函数专题, this指针, 析构函数,复制函数,赋值函数,初始化问题,设计模式

相关文章
相关标签/搜索