#pragma once 与 #ifndef...#define...#endif的比较
来源:互联网 发布:q币可以在淘宝买东西吗 编辑:程序博客网 时间:2024/05/21 04:22
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 ...
① 用#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不是标准,只是在微软的一个功能,但是现在大部分编译器都实现了。
0 1
- #pragma once与#ifndef #define #endif的区别 (比较全)
- #pragma once 与 #ifndef...#define...#endif的比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once 和#ifndef ... #define ... #endif 比较
- #pragma once与#ifndef #define #endif
- #pragma once与#ifndef #define ...#endif的区别
- #pragma once与#ifndef #define ...#endif的区别
- #pragma once与#ifndef #define ...#endif的区别
- #pragma once与#ifndef #define ...#endif的区别
- #pragma once与#ifndef #define #endif的区别
- #pragma once与#ifndef #define ...#endif的区别
- #pragma once与#define #ifndef ...#endif的区别
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
- #ifndef...#define...#endif与#pragma once深度解析(不是比较区别)
- 工作中的tips~(一)
- [深度学习]Wake-Sleep算法
- 关于RecyclerView实现瀑布流,上下滑动时item之间互换位置的问题
- Tomcat与Java Web开发的思维导图
- “玲珑杯”郑州轻工业学院第九届ACM程序设计大赛圆满结束
- #pragma once 与 #ifndef...#define...#endif的比较
- 脚本作业
- LeetCode (Next Permutation)
- [SMOJ1829]公司招聘
- CNN Reranking Question-Answer Pairs 句子矩阵宽卷积和窄卷积方法
- vue.js学习笔记--遇到的那些问题
- Android studio Error:(1, 1) 错误: 非法字符: '\ufeff' 解决方案
- mysql基本操作
- ASP.NET 在IIS操作WORD文档出错的解决办法