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的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma方式
#pragma once ... ... // 一些声明语句
#pragma once 是个预处理指令,在头文件的最开始加入这条指令表示:这个头文件只被编译一次 #pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处 是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当 然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
总结: 1. #ifndef 由语言支持所以移植性好,#pragma 可以避免名字冲突
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
全面了解#pragma once与 #ifndef的区别
为了避免同一个文件被include多次 1 #ifndef方式 2 #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别. 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 一些声明语句 #endif 方式二: #pragma once ... ... // 一些声明语句 #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次
-
浅谈#ifndef,#define,#endif的作用和用法
问题:ifndef/define/endif"主要目的是防止头文件的重复包含和编译 ======================================================== 用法: .h文件,如下: #ifndef XX_H #define XX_H ... #endif 这样如果有两个地方都包含这个头文件,就不会出现两次包含的情况 .. 因为在第二次包含时 XX_H 已经有定义了,所以就不再 include了 ------------------------------
-
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的方式依赖于
-
解析php中static,const与define的使用区别
define部分:宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.)宏的语法为:#define 宏名称 宏值作为一种建议和一种广大程序员共同的习惯,宏名称经常使用全部大写的字母.利用宏的优点:1)让代码更简洁明了当然,这有赖于你为宏取一个适当的名字.一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点.2)方便代码维护对宏的处理,在编译过程中称为"预处理".也就是说在正式编译前,编译器必须先将代码出现的宏,用
-
C++中操作符的前置与后置有什么区别
目录 一.值得思考的问题 二.意想不到的事实 三.++ 操作符重载 四.真正的区别 五.小结 一.值得思考的问题 下面的代码有没有区别?为什么? 二.意想不到的事实 现代编译器产品会对代码进行优化 优化使得最终的二进制程序更加高效 优化后的二进制程序丢失了 C/C++ 的原生语义 不可能从编译后的二进制程序还原 C/C++ 程序 三.++ 操作符重载 ++ 操作符可以重载吗?如何区分前置++ 和后置++? ++ 操作符可以被重载 全局函数和成员函数均可进行重载 重载前置++操作符不需要额外的参数
-
JSP中Servlet的Request与Response的用法与区别
JSP中Servlet的Request与Response的用法与区别 简介:Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了.要向客户机输出数据,只需要找response对象就行了. 一,Request Request代表请求对象,其中封装了对请求中具有请求行.请求头.实体内容的操作的方法
-
java 中同步、异步、阻塞和非阻塞区别详解
java 中同步.异步.阻塞和非阻塞区别详解 简单点说: 阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回: 非阻塞就是你先干,我先看看有其他事没有,一发现事情被卡住,马上报告领导. 我们拿最常用的send和recv两个函数来说吧... 比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话
-
详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理"."和".."的情况 3.getCanonicalPath(): 返回的是规范化的绝对路径,相当于将getAbsolutePath()中的"."和".."解析成对应的正确的路径 第一个例子:(使用:".\\src\\test.txt&qu
-
java 中 System.out.println()和System.out.write()的区别
java 中 System.out.println()和System.out.write()的区别. 这两个函数一个是System.out.write()输出字符流,System.out.println()是输出字节流,很简单.看下面这个程序就明白了. //import java.util.*; public class Test { public static void main(String[] args){ // Scanner in = new Scanner(System.in);
-
ASP.NET中URL Routing和IIS上URL Rewriting的区别
前言 前面有2篇帖子提到了关于URL Routing的特性,但是发现有很多人误会URL Routing就是URl Rewriting,其实2个虽然都提供相似的功能(提高友好的URL方便搜索引起收录),但是2者的原理和运行周期是完全不一样的,本篇文章我们就来分析一下具体有什么不同. 例子 在分析原理之前,我们先来做一个例子测试一下(IIS URL Rewrite模块需要IIS7的支持). 1.为Customer/1的URL建立对应的MVC程序 首先建立一个普通的MVC3程序,建立一个简单的Cust
-
JavaScript中innerHTML,innerText,outerHTML的用法及区别
不废话了,请看下文示例介绍. 用法: <div id="test"> <span style="color:red">test1</span> test2 </div> 在JS中可以使用: test.innerHTML: 也就是从对象的起始位置到终止位置的全部内容,包括Html标签. 上例中的test.innerHTML的值也就是"<span style="color:red">
随机推荐
- 解决在Web.config或App.config中添加自定义配置的方法详解
- php实现的XML操作(读取)封装类完整实例
- Python xlrd读取excel日期类型的2种方法
- 关于react-router的几种配置方式详解
- HttpWebRequest和HttpWebResponse用法小结
- 队列在编程中的实际应用(php)
- php链表用法实例分析
- C#实现winform用子窗体刷新父窗体及子窗体改变父窗体控件值的方法
- 浅析C语言中的内存布局
- javascript实现的一个自定义长度的文本自动换行的函数。
- 调用DOM对象的focus使文本框获得焦点
- XML动态菜单 (二)flash
- js获取当前路径的简单示例代码
- 简单谈谈ThreadPoolExecutor线程池之submit方法
- python实现根据图标提取分类应用程序实例
- webstorm中配置nodejs环境及npm的实例
- pandas DataFrame索引行列的实现
- 在Linux上识别同样内容的文件详解
- Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
- python中enumerate() 与zip()函数的使用比较实例分析