全面了解#pragma once与 #ifndef的区别
为了避免同一个文件被include多次
1 #ifndef方式
2 #pragma once方式
在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif
方式二:
#pragma once
... ... // 一些声明语句
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心"撞车",可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的"同一个文件"是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处 是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当 然,相比宏名碰撞引发的"找不到声明"的问题,重复包含更容易被发现并修正。
方式一由语言支持所以移植性好,方式二 可以避免名字冲突
以上这篇全面了解#pragma once与 #ifndef的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别
C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别 pragma once 之前一直用的很好,今天和同事的配合中发现自己没有真正理解pragma once. 原因:同事喜欢把公共的头文件通过生成后事件复制到一个公共的include文件夹中. 摘抄: #ifndef方式: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ 1 ... ... // 一些声明语句 #endif #ifndef的方式依赖于
-
浅谈#ifndef,#define,#endif的作用和用法
问题:ifndef/define/endif"主要目的是防止头文件的重复包含和编译 ======================================================== 用法: .h文件,如下: #ifndef XX_H #define XX_H ... #endif 这样如果有两个地方都包含这个头文件,就不会出现两次包含的情况 .. 因为在第二次包含时 XX_H 已经有定义了,所以就不再 include了 ------------------------------
-
全面了解#pragma once与 #ifndef的区别
为了避免同一个文件被include多次 1 #ifndef方式 2 #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别. 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 一些声明语句 #endif 方式二: #pragma once ... ... // 一些声明语句 #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次
-
解析C++多文件编程问题
目录 一.多文件编程是什么 二.如何防治头文件被重复引入 1. 使用宏定义避免 2. 使用 #pragma once 避免 3. 使用 _Pragma 操作符 三.命名空间如何应用在多文件编程中 四.const常量如何在多文件编程中使用 1. 将 const 常量定义在 .h 头文件中 2. 借助 extern 先声明再定义 const 常量 3. 借助 extern 直接定义 const 常量 五.多文件项目如何用 g++ 命令执行 六.多文件编程的底层原理 一.多文件编程是什么 为了方便后期
-
详解C++ 前置声明
前置声明是C/C++开发中比较常用的技巧,主要用在三种情形: 变量/常量,例如extern int var1;; 函数,例如void foo();,注意类的成员函数无法单独做前置声明: 类,例如class Foo;,也可以前置声明模板类:template class<typename T1, int SIZE>Foo;.如果类包含在名字空间中,需在名字空间内做前置声明:namespace tlanyan {class Foo;};,而不能这样:class tlanyan::Foo;. 前置声明
-
c++ 防止头文件重复引入的三种方法
在之前我们详细介绍了 C 语言中如何使用宏定义(#ifndef / #define / #endif)来有效避免头文件被重复 #include,此方式在 C++ 多文件编程中也很常用. 举个例子,如下是一个 C++ 项目,其内部含有 school.h 和 student.h 这 2 个头文件以及 main.cpp 源文件,其各自包含的代码为: //student.h class Student { //...... }; //school.h #include "student.h&qu
-
C语言中#pragma once的作用
目录 1.#pragma once有什么作用? 2.两者的使用方式有何区别? 3.两者各有何特点? (1)#ifndef (2)#pragma once 4.两者之间有什么联系? 1.#pragma once有什么作用? 为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式:另一种是#pragma once方式. 在能够支持这两种方式的编译器上,二者并没有太大的区别.但两者仍然有一些细微的区别. 2.两者的使用方式有何区别? 示例代码如下: /
-
JSP之表单提交get和post的区别详解及实例
JSP之表单提交get和post的详解及实例 一 get和post的区别 二 实战(post方式提交) 1.login.jsp <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %> <% String path = request.getContextPath(); String basePath = req
-
perl中my与our的区别介绍
先来看下our的用法. require 5.006当版本号小于 5.006 的时候,会返回失败,从而导致模块加载失败.所以它的作用就是保证模块调用环境的 Perl 版本. our 和 my 一样,都是对变量的声明,不过 our 声明的是包全局变量,而 my 声明的是词法变量. 不过,经过 our 声明的变量,它会变得像一个词法变量一样,其实这也是 our 存在的目的:用来欺骗 strict pragma,使 strict 以为它是一个词法变量,其实却不是. 有一个简单的办法可以理解 our:1,
-
IOS 开发之 NSMutableArray与NSArray 的区别
IOS 开发之 NSMutableArray与NSArray 的区别 首先,来看下2者的区别: NSArray and its subclass NSMutableArray manage collections of objects called arrays. NSArray creates static arrays, and NSMutableArray creates dynamic arrays. NSMutableArray是NSArray的子类,NSArray建立静态数组,而NS
-
perl中my和our的区别分析
perl中our的用法require 5.006当版本号小于 5.006 的时候,会返回失败,从而导致模块加载失败.所以它的作用就是保证模块调用环境的 Perl 版本. our 和 my 一样,都是对变量的声明,不过 our 声明的是包全局变量,而 my 声明的是词法变量. 不过,经过 our 声明的变量,它会变得像一个词法变量一样,其实这也是 our 存在的目的:用来欺骗 strict pragma,使 strict 以为它是一个词法变量,其实却不是. 有一个简单的办法可以理解 our:1,你
随机推荐
- 比较详细Python正则表达式操作指南(re使用)
- vue.js入门(3)——详解组件通信
- WIN2008 R2上安全加强方面的四点注意事项!
- Dynamic Activity Window动态活动窗口vbs
- asp.net下将图片保存到XML文件的方法
- 原生JS实现拖拽图片效果
- CodeIgniter基本配置详细介绍
- Python序列操作之进阶篇
- java 中接口和抽象类的区别与对比
- MySQL实现MYISAM表批量压缩的方法
- 全面了解javascript中的错误处理机制
- 浅谈Eclipse PDT调试PHP程序
- 直接拷贝数据文件实现Oracle数据迁移
- 单击某一段文字改写文本颜色
- JQuery 选择和过滤方法代码总结
- javascript option onclick事件ie解决方案 兼容ie,firefox
- IIS无法启动提示“服务没有及时响应启动或控制请求”的解决方法[图解]
- Android 登录处理简单实例(源码下载)
- Android开发实例之多点触控程序
- ant打包jar文件脚本分享