C++如何防止头文件被二次编译

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文件。

并且由于编译器每次都必须打开头文件才能判断是否有重复定义,在大型项目中,宏定义的方法会使得编译时间相对较长。




你可能感兴趣的:(C++)