zoukankan      html  css  js  c++  java
  • VC中#ifdef与#pragma once避免重复包含的区别(转)

    在用VC6.0向导生成的头文件中,经常可以看见如下的代码段: 

    #if !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_) 
    #define AFX_RESIZABLELAYOUT_H__INCLUDED_ 

    #if _MSC_VER > 1000 
    #pragma once 
    #endif // _MSC_VER > 1000 

    ... 

    #endif // !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_) 

    对于宏有基本了解的朋友应该都知道,头文件中如下的宏定义,是为了避免同样的头文件在同一个.C文件或者.CPP文件多次包含。 

    #if !defined(XXX) 
    #define XXX 

    #endif 


    这很好理解,但接下来的一段,尤其是#pragma once的意思,我就不是很清楚了。从MSDN得到pragma once的解释是: 

    "Specifies that the file will be included (opened) only once by thecompiler when compiling a source code file." 

    英文注释的大意也是说#pragma once是为了避免文件重复包含。疑惑就此产生了,既然宏"#if !defined"已经有这个作用了,为何还要一个"#pragma once"呢? 我接着在网上搜到了几份答案,但大家的回答都很模糊,于是我想放弃,不再想这个问题,但还是不太甘心,就接着看了看别人的解释。突然间,好像灵犀一点,开窍了。虽然"#if !define"和"#pragma once"都有避免重复包含的功能,但是在实现上还是有区别的。举一例如下: 

    // Test1.h 
    #if !define (__TESTONE_H_) 
    #define __TESTONE_H_ 
    ... 
    #endif 

    // Test2.h 
    #pragma once 
    ... 

    // Test.cpp 
    #include "Test1.h" // line 1 
    #include "Test1.h" // line 2 
    #include "Test2.h" // line 3 
    #include "Test2.h" // line 4 

    ... 

    头文件Test1.h中用宏来避免重复,头文件Test2.h中用#pragma once来避免重复。编译Test.cpp,将需要打开Test1.h两次,第一次发现宏__TESTONE_H_没有定义,接着就处理宏定义;第二次打开Test1.h时,发现宏__TESTONE_H_已经定义过了,编译器就会略过宏定义部分,知道处理完Test1.h末尾的#endif。 

    而由于头文件Test2.h使用#pragma once来避免重复定义的,在编译Test.cpp的过程中,Test2.h只会被打开一次,也就是处理到第3行的时候。因为Test2.h用的是#pragma once,所以在处理完第3行后,编译器已经知道包含了一次Test2.h,在它(编译器)处理第4行代码时,发现Test2.h已经包含过了,忽略掉第4行代码,也就不需要再次打开Test2.h进行判断了。 

    总结一下,除了#pragma once是微软编译器所特有的之外,用宏和#pragma once的办法来避免重复包含头文件,主要区别在于宏处理的方法会多次打开同一头文件,而#pragma once则不会重复打开,从而#pragma once能够更快速。
  • 相关阅读:
    Azure HPC Pack Cluster添加辅助节点
    Azure HPC Pack 辅助节点模板配置
    Azure HPC Pack配置管理系列(PART6)
    Windows HPC Pack 2012 R2配置
    Azure HPC Pack 节点提升成域控制器
    Azure HPC Pack VM 节点创建和配置
    Azure HPC Pack 部署必要条件准备
    Azure HPC Pack 基础拓扑概述
    Azure VM 性能计数器配置
    Maven私仓配置
  • 原文地址:https://www.cnblogs.com/Daywei/p/1988138.html
Copyright © 2011-2022 走看看