1、防止循环包含
A.h中写#include "B.h"
在A.h中可以直接定义类B的对象;比如 B m_b;
而在B.h中不能直接写#include "A.h"
应该写
class A;//声明B是一个外部类。这个必须要用,不能只用#include "A.h",如果只是#include "A.h"而没有class A;则会报错.
Class B
{
A *pA;//声明一个指向A类对象的指针
};
然后在B.cpp中加入#include "A.h"
再在B的构造函数中,使用new方式对pA进行实例化,构建A的类对象,并通过pA在程序中访问
2、防止重复包含
是为了避免同一个文件被include多次使用,
1)、#pragma once(比较常用)
这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次
#pragma once用来防止某个头文件被多次include,#ifndef,#define,#endif用来防止某个宏被多次定义。
#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。
#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式
2)、使用条件编译
#ifndef _HEADERNAME_H
#define _HEADERNAME_H
...//(头文件内容)
#endif
当头文件第一次被包含时,它被正常处理,符号_HEADERNAME_H被定义为1。如果头文件被再次包含,通过条件编译,它的内容被忽略。符号_HEADERNAME_H按照被包含头文件的文件名进行取名,以避免由于其他头文件使用相同的符号而引起的冲突。但是,必须记住预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将拖慢编译速度,所以如果可能,应该避免出现多重包含。