#pragma once与#ifndef的区别

#pragma once与#ifndef的区别

一、相同点是:html

   为了不同一个文件被include屡次。程序员

二、不一样点是:模块化

    在可以支持这两种方式的编译器上,两者并无太大的区别,可是二者仍然仍是有一些细微的区别。post

  1. 方式一: #ifndef
  2. #ifndef __SOMEFILE_H__
  3. #define __SOMEFILE_H__
  4. ... ... // 一些声明语句
  5. #endif
     
  6. 方式二: #pragma once
  7. #pragma once
  8. ... ... // 一些声明语句

    #ifndef的方式依赖于宏名字不能冲突,这不光能够保证同一个文件不会被包含屡次,也能保证内容彻底相同的两个文件不会被不当心同时包含。固然,缺点就是若是不一样头文件的宏名不当心“撞车”,可能就会致使头文件明明存在,编译器却硬说找不到声明的情况。

    #pragma once则由编译器提供保证:同一个文件不会被包含屡次,即可以保证头文件被编译一次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你没必要再费劲想个宏名了,固然也就不会出现宏名碰撞引起的奇怪问题。对应的缺点就是若是某个头文件有多份拷贝,本方法不能保证他们不被重复包含。固然,相比宏名碰撞引起的“找不到声明”的问题,重复包含更容易被发现并修正。

三、总结来讲:
   #ifndef方式由语言支持因此移植性好,可是在包含一个文件的时候,只有打开这个文件,根据文件的保护宏是否已经被定义来判断此文件是否已经被包含过,因此效率相对较低。固然在#include的时候,程序员也能够本身判断所要包含的文件的保护宏是否已经被定义,来决定是否要包含这个文件。相似下面的代码:spa

  1. #ifndef FILE_H_
  2. #include "file.h"
  3. #endif
这样做能够获得较高的效率,并且保证可移植性。可是文件之间的依赖性较高,若是一个文件的保护宏改变的话,全部使用如上形式包含这个文件的文件都要修改,有悖于模块化的思想。

    #pragma once方式能够避免名字冲突,可是是平台相关的因此可移植性比较差,可是它效率更高:由于不须要去打开包含的文件,就能够判断这个文件有没有被包含,固然这个工做是系统帮咱们完成的。code

相关文章
相关标签/搜索