#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不是标准,只是在微软的一个功能,但是现在大部分编译器都实现了。
① 用#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不是标准,只是在微软的一个功能,但是现在大部分编译器都实现了。
相关文章推荐
- #pragma once 和#ifndef ... #define ... #endif 比较
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- pragma once VS ifndef define endif
- #pragma once 和 #ifndef ... #define ... #endif 的区别【转载】
- #pragma once 和 #ifndef ... #define ... #endif 的区别【转载】
- 头文件中ifndef/define/endif的作用以及#pragma once使用
- #pragma once 和 #ifndef ... #define ... #endif 的区别【转载】
- #ifndef...#define...#endif与#pragma once深度解析(不是比较区别)
- #ifndef..#define..#endif和#pragma once的区别
- #ifndef……#define……#endif与#pragma once
- C语言拾遗:ifndef/define/endif 与 #pragma once
- #pragma once 和 #ifndef ... #define ... #endif 的区别