一、相同点是:html
为了不同一个文件被include屡次。程序员
二、不一样点是:模块化
在可以支持这两种方式的编译器上,两者并无太大的区别,可是二者仍然仍是有一些细微的区别。post
#ifndef的方式依赖于宏名字不能冲突,这不光能够保证同一个文件不会被包含屡次,也能保证内容彻底相同的两个文件不会被不当心同时包含。固然,缺点就是若是不一样头文件的宏名不当心“撞车”,可能就会致使头文件明明存在,编译器却硬说找不到声明的情况。
#pragma once则由编译器提供保证:同一个文件不会被包含屡次,即可以保证头文件被编译一次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你没必要再费劲想个宏名了,固然也就不会出现宏名碰撞引起的奇怪问题。对应的缺点就是若是某个头文件有多份拷贝,本方法不能保证他们不被重复包含。固然,相比宏名碰撞引起的“找不到声明”的问题,重复包含更容易被发现并修正。
三、总结来讲:
#ifndef方式由语言支持因此移植性好,可是在包含一个文件的时候,只有打开这个文件,根据文件的保护宏是否已经被定义来判断此文件是否已经被包含过,因此效率相对较低。固然在#include的时候,程序员也能够本身判断所要包含的文件的保护宏是否已经被定义,来决定是否要包含这个文件。相似下面的代码:spa
#pragma once方式能够避免名字冲突,可是是平台相关的因此可移植性比较差,可是它效率更高:由于不须要去打开包含的文件,就能够判断这个文件有没有被包含,固然这个工做是系统帮咱们完成的。code