• pragma once VS ifndef define endif


    本文来自CSDN博客:http://blog.csdn.net/roger_it/archive/2007/02/09/1506249.aspx

     本文结论:

      所以对于公有或者接口的文件,使用ifndef define endif,对于内部的文件使用pragma once.

    在vc6的时代头文件一般使用ifndef define endif

    在vc7的时代头文件一般成了pragma once

    不知道有没有人深究其中的意义

    为什么有这样的代码,是为了头文件不被重复引用,那样编译器抱错的,这两种方法都是同样的目的,有没有区别呢?

    还是举例来说明,可能有好几个库,每个库内部可能都有public.h这个文件,如果使用

    ifndef public_h

    define public_h

    ...

    endif

    那么当一个文件同时引用两个这样的库时,后一个库里的文件就不被编译了,而pragma once可以保证文件只被编译一次

    看起来pragma once比ifndef define endif要好,那么ifndef define endif

    的地方都pragma once好了。今天碰到了又一个例子,比如你有一个zlib.h在几个库都用到,而为了方便,把zlib每个目录下copy了一分,因为这个文件不会作修改,已经很完整了,这个时候如果使用pragma once,就会重复定义,看来ifndef define endif还是又派上用场的地方。

    所以对于公有或者接口的文件,使用ifndef define endif,对于内部的文件使用pragma once.

    #pragma once 与 #ifndef #define #endif 的区别

    对于#pragma once,根据MSDN解说,能够防止一个文件被多次包含。与#ifndef #define #endif形式的文件保护相比,前者是平台相关的,可移植性比较差,但是它效率更高,因为它不需要去打开包含的文件,就可以判断这个文件有没有被包含。当然这个工作是系统帮我们完成的。 

    后者的优点在于它是语言相关的特性,所以可移植性好。但是在包含一个文件的时候,只有打开这个文件,根据文件的保护宏是否已经被定义来判断此文件是否已经被包含过。效率相对较低。当然在#i nclude的时候,程序员也可以自己判断所要包含的文件的保护宏是否已经被定义,来决定是否要包含这个文件。类似下面的代码: 

    #ifndef FILE_H_

    #i nclude "file.h"

    #endif

    这样作可以得到较高的效率,而且保证可移植性。但是文件之间的依赖性较高,如果一个文件的保护宏改变的话,所有使用如上形式包含这个文件的文件都要修改。有悖于模块化的思想。

  • 相关阅读:
    【彩彩只能变身队】(迟到的)团队介绍
    【彩彩只能变身队】用户需求分析(二)—— 调查结果
    【彩彩只能变身队】用户需求分析(一)—— 调查问卷
    C语言I博客作业04
    C语言I博客作业06
    c语言1作业07
    C语言I博客作业03
    C语言I博客作业02
    C语言I博客作业05
    【OpenGL编程指南】之投影和视口变换
  • 原文地址:https://www.cnblogs.com/gdxmagic/p/3337363.html
Copyright © 2020-2023  润新知