避免头文件重复包含

一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含。我们可以使用编译预处理命令避免这种情况的发生。

 

例如,你想确保头文件max.h不会被重复包含,则你可以采取如下的形式:

 

 

第一条预处理命令是说,如果MAXMIN_H不为真,说明此文件没被包含过,此命令后面的源代码有效(相当于:‘如果大门没关,请您进来’);

 

第二条预处理命令把MAXMIN_H置为真(相当于请您把门锁插上,不让第二个人进来)。

 

最后一条预处理命令是为了标出接受上述处理的源程序的范围(相当于您已经走到了后门)。

 

假定有以下几个头文件及其包含关系为:

  File1.h,file2.h,file3.h,file4.h,file5.h,main.cpp

  那么:file3.h包含file1.h,file2.h,file4.h包含file1.h,file2.h,file5.h包含file3.h,file4.h。就会导致在file5中对file1和file2的反复包含,编译时就会报错。

  解决方法1:

  1:应用#ifndef

  #define

  #endif

  即每个文件在定义时都写成以下情势(以file1.h为例):

  #ifndef H_FILE1

  #define H_FILE1

  #include<stdio.h>

  #include<math.h>

  …..

  #endif

  File3.h:

       #ifndef H_FILE3

  #define H_FILE3

  #include<stdio.h>

  #include<math.h>

  #inlcude”file1.h”

  #include”file2.h”

  …..

#endif

#ifndef的方式受C/C++语言标准支持。它不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。

缺点就是如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,编译器却硬说找不到声明的状况——这种情况有时非常让人抓狂。

由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。

  方法二:在每个文件的头部定义:#pragmaonce(用于解释本文件中的内容只应用一次)

  例:fiel1.h:

  #pragmaonce

  #include<stdio.h>

  #include<math.h>

  …..

  File3.h:

  #pragmaonce

  #include<stdio.h>

  #include<math.h>

  #include”file1.h”

…..

#pragma once一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。

缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值