您的位置:首页 > 其它

#pragma once 与 #ifndef...#define...#endif的比较

2017-04-27 11:34 453 查看
C++中防止头文件被多次include 的常见方式有:

① 用#ifndef ...  #define ... #endif  宏

 

#ifndef __MYHEAD_H__
#define __MYHEAD_H__

 

// Here is my class ... 

#endif 

 这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。

② 用 #pragma once

#pragma once

// Here is my class ... 

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

在这里呢,我建议使用#pragma once

优势:

①代码简洁,维护性比较好。 #pragma once 显然比 #ifndef ...  要简短许多,而且避免了__MYHEAD_H__ 重定义 或者 #endif 包含范围错误的情况。

②编译速度快。  使用 #ifndef 的话,编译器每次看到#include这个文件都需要读入文件,解析代码。  而使用#pragma once 编译器根本不会重复打开文件, 大大提高了效率。 

③#pragma once是针对文件的,它告诉编译器,本文件只编译一次(根据文件名,路径等信息来保证其唯一性),而Include
guard是保证其宏定义ifndef define 。。。endif 内的内容不被重复编译。

另外,提醒一下,#pragma once不是标准,只是在微软的一个功能,但是现在大部分编译器都实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: