if !defined与pragma once

2024-09-06 08:18
文章标签 defined pragma

本文主要是介绍if !defined与pragma once,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

两者的共同点都是为了避免同一个文件被include多次,但是各有千秋。

在用VC6.0向导生成的头文件中,经常可以看见如下的代码段: 

#if !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_) 
#define AFX_RESIZABLELAYOUT_H__INCLUDED_ 

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 

...  

#endif // !defined(AFX_RESIZABLELAYOUT_H__INCLUDED_)

_MSC_VER  定义编译器的版本,下面是一些编译器版本的_MSC_VER值:

  MS VC++ 9.0 _MSC_VER = 1500
  MS VC++ 8.0 _MSC_VER = 1400
  MS VC++ 7.1 _MSC_VER = 1310
  MS VC++ 7.0 _MSC_VER = 1300
  MS VC++ 6.0 _MSC_VER = 1200
  MS VC++ 5.0 _MSC_VER = 1100
    其中MS VC++ 9.0就是Visual C++ 2008,MS VC++ 8.0就是Visual C++ 2005。

(1)#pragma once是编译相关的,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。
(2)#ifndef / #define / #endif是C++语言相关的,它是通过C++语言中的宏定义来避免头文件被多次编译的。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。

使用#pragma once 代替 include 方法将加快编译速度,因为这是一种高阶的机制;编译器会自动比对档案名称或inode(中文就是索引节点,个人认为就是路径了)而不需要在标头档去判断 #ifndef 和 #endif。

#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

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

ifndef能保证如果一个文件被重复放在了不同的地方时编译也不会出错。而如果出现一个文件被重复放到了不同地方,且都被包含的话,仅仅使用#pragma once还是会出现编译错误的。

因此当你做的工程中有多个项目,或者因为其他情况需要引用并且拷贝同一个头文件,即存在两个完全相同头文件时,这时使用#if !defined + #pragma once 将会是一个不错的选择。

原文链接:http://www.cnblogs.com/wangaohui/p/3298445.html

这篇关于if !defined与pragma once的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141486

相关文章

Unable to instantiate Action, goodsTypeAction, defined for 'goodsType_findAdvanced' in namespace '/

报错: Unable to instantiate Action, goodsTypeAction,  defined for 'goodsType_findAdvanced' in namespace '/'goodsTypeAction......... Caused by: java.lang.ClassNotFoundException: goodsTypeAction.......

解决The valid characters are defined in RFC 7230 and RFC 3986

解决方法: 一、更换低版本的Tomcat;(我选的方案) 二、参考:https://blog.csdn.net/qq_32365919/article/details/82055800

function 报错 Uncaught ReferenceError: fuzzySearch is not defined用$(document).ready(function(){ })里面的

这个情况就有点坑了 ,小胖哥看了都说写法没大问题,后面觉得把 function 函数弄出去的话试下,果然可以了!!!  $(document).ready(function(){ })里面的 function 报错 Uncaught ReferenceError: fuzzySearch is not defined 先来图看看,第一张图跟 第二张图 看起来代码写的很规矩?

idea报错Cannot compile Groovy files: no Groovy library is defined for module 'xx'之方

0、病因描写 clone 原有的项目(新建的项目一般不会有) IntelliJ IDEA 关联了后缀为groovy的文件但是没有配置Groovy的library。 1、病因一之解决方法 病因:本项目不需要用的Groovy但是关联了groovy了文件 方子:那直接去掉后缀为groovy的关联即可 结果:良好,网上基本都是这种方子 如图:去掉红框部分并apply 2、病

生产环境突然编译报错:‘XXXX‘ is not defined no-undef

在某年某月的某一天(2021-02-24),在一个前端工程里面,我就改了一个字段名, 对gitlab发誓,除此以外,啥也没动。 而且,在本地,npm start,启动前端项目,和往常一样,完美的连一个警告都没有,就像这样: 真是如丝般润滑,然而,分别发布到测试环境和生产环境,就碰到纠缠我好几天的诡异之事了。 他报了一个下面的错误:     但是这个Map.jsx,我是从来没碰

Error:(106) Attribute quot;rippleColorquot; has already been defined

compile 'com.github.navasmdc:MaterialDesign:1.5@aar' 扁平化设计,导入出现: Error:(106) Attribute "rippleColor" has already been defined 解决: compile 'com.github.navasmdc:MaterialDesign:1.3.2'

Error creating bean with name 'redisTemplate' defined in URL

最近使用Spring 整合Redis出现了这类问题: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisTemplate' defined in URL [file:/E:/workspace/spring-ssm/target/classes/spring/s

遇到“Interpreter parsed an intent ‘xxx‘ which is not defined in the domain“报错

运行rasa shell的时候遇到如图报错: 从字面意思来看是这个”show_tasks”的intent没有在domain中定义。但是我打开domain.yml检查,domain里面是包含了这个intent的。那又是怎么回事呢? 遇到这个报错,不仅仅要检查domain.yml,还要查看nlu.md这个文件,要比对两个文件中intent的命名是否一致?若命名不一致,则会在rasa shell

DLL文件编译出错_DllMain@12 already defined in XXX.obj

编译MFC DLL程序时出现 Error 2 error LNK1169: one or more multiply defined symbols found E:\C++\HookTest\CopyFileDetour\CFDetour\Debug\1t.dll 1 1t 1 Error 1 error LNK2005: _DllMain@12 already defined in 1t