C++编程时如果多个类引用同一个头文件,有可能会产生二次编译的错误,比如公共头文件common.h被CFile1.h和CFile2.h引用,在主函数CFile类中同时引用CFile1.h和CFile2.h时,编译器会报如下错误:text\common.h(3): error C2011: “common”:“class”类型重定义
为了解决以上问题,C++有两种防止头文件被二次编译的方式。
第一种方法采用#pragma once,属于编译器预编译命令。
该方法的优点:避免名字冲突
该方法的缺点:与编译器相关,较早的编译器不支持该方法,且该方法不适用跨平台程序。
并且如果某个头文件有多份拷贝,该方法不能保证不被重复包含。
另一种是采用宏定义
#ifndef XXXX
#define XXXX
//program codes
#endif XXXX
该方法的优点:语言支持,移植性好可用于跨平台的程序
该方法的缺点:宏名字不能冲突,比如:
CFile1头文件中
#ifndef __FILE_H__
#define __FILE_H__
//program codes
#endif
CFile2头文件中也定义了一样的宏。
当在主函数CFile中引用以上两个文件
#include "File1.h"
#include "File2.h"
.................
预编译阶段把File1文件展开,获得宏__FILE_H__,当处理File2文件中发现宏__FILE_H__已经存在,则不会在包含File2文件。
并且由于编译器每次都必须打开头文件才能判断是否有重复定义,在大型项目中,宏定义的方法会使得编译时间相对较长。