关于#pragma once和#ifndefine组合的区别

最近在看duilib代码,发现头文件既有#pragma once 又有 #ifndefine...#define,忽然就觉得有点不解,因为据我所知这两者都是防止头文件二次包含的。

经过下面两位的解释后,加深了认识:

http://www.cnblogs.com/Braveliu/archive/2012/12/29/2838726.html

http://blog.csdn.net/zlhy_/article/details/8192580

总结一下:

1.#pragma是微软独有的,不能跨平台使用,我印象中#pragma是编译器相关指令吧,当然就是与编译器相关的了

2.然后#ifndefine存在弊端:

(引用上面参考的原文)

<第一种:file1头文件中有一个宏

//file1.h

#define BOOK_H   //宏名

现在又有一个文件 book.h 里面使用了宏定义方式防止头文件二次编译

#ifndef BOOK_H

#define BOOK_H

//  program codes

#endif

下面是你的主函数所在文件内容

#include"fil1.h"

#include"book.h"   //这两个都是你自己的头文件

#include<........>

..................

预编译阶段把file1文件展开,就得到了宏 BOOK_H,在处理book.h文件时就发现BOOK_H这个宏已经存在了,就不会包含book.h头文件了,这就是弊端所在了。>

也就是说,如果自己在头文件a中定义了和头文件b一样的宏,就会导致b没有包含进去,不过这种可能性还是比较少的,因为#ifndefine 的宏名称都相对比较特殊,类似: _File_NAME_H_  什么的

3.效率也存在差异: 由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长

4.#pragma 针对文件,不能在某段代码中插入

5.两者一起用的情况:

duilib的一段代码:

#ifndef __UIBASE_H__
#define __UIBASE_H__

#pragma once

。。。

(引用上面参考的原文) < 看起来似乎是想兼有两者的优点。不过只要使用了#ifndef就会有宏名冲突的危险,也无法避免不支持#pragma once的编译器报错,所以混用两种方法似乎不能带来

更多的好处,倒是会让一些不熟悉的人感到困惑。>

所以我对duilib里面两者一起用的情况确实有点不解,其实是两种缺点都包含了吧,又不是优点整合吧

时间: 2024-12-22 22:20:10

关于#pragma once和#ifndefine组合的区别的相关文章

UML的关联(Association), 聚合(Aggregation), 组合(Composition)区别

转载:http://blog.csdn.net/ocean181/article/details/6117369 三者描述对象的附属[也就是依赖]关系: 关联<聚合<组合, 依赖关系是逐渐加强的. inheritance: "a kind of": 猫是一种动物,说明猫从动物继承: association: 两者之间存在某种关联即可,很弱的关系,如student and course, 每个学生可以选不同的课,每门课上有不同学生: aggregation: "co

java--依赖、关联、聚合和组合之间区别的理解

在学习面向对象设计对象关系时,依赖.关联.聚合和组合这四种关系之间区别比较容易混淆.特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境.特定情景等. 依赖(Dependency)关系是类与类之间的联接.依赖关系表示一个类依赖于另一个类的定义.例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House.与关联不同的是,Person类里并没有Car和House类型的属性,Car和Hous

关联关系:依赖、关联、聚合和组合之间区别

在学习面向对象设计对象关系时,依赖.关联.聚合和组合这四种关系之间区别比较容易混淆.特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境.特定情景等.他们在编程语言中的体现却是基本相同的,但是基本相同并不等于完全相同,这一点在我的前一篇博文<设计模式中类的关系>中已经有所提及,下面就来详细的论述一下在java中如何准确的体现依赖.关联.聚合和组合. 首先看一看书上对这四种关系的定义: 依赖(Dependency)关系是类与类之间的联接.依赖关系表示一个类依赖于另一个类的定义.例如,一

项目集与项目群、项目组合的区别

项目集与项目组合是项目管理理论发展最新的产物,PMI对项目集与项目组合进行了明确的定义.项目集.项目组合与项目群存在一定的区别与联系,以下将对项目集.项目群及项目组合之间的联系与区别进行分析. PMI认为,项目集(Program)是一组相互关联且被协调管理的项目.项目集管理是指对项目集进行统一协调管理,以实现对单个项目分别管理所无法实现的利益和控制.项目集中的项目通过产生共同的结果或整理能力而相互联系. 项目群的定义与项目集类似,项目群(Program)包含的项目以协调的方式进行管理,其目的在于

聚合和组合的区别

恩,画类关系图的时候,分不太清聚合和组合.让同事讲了讲就更晕乎了.找个帖子学习学习 http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 聚合:表示两个对象之间是整体和部分的弱关系,部分的生命周期可以超越整体.如电脑和鼠标,就可以用一下图形表示: 组合:表示两个对象之间是整体和部分的强关系,部分的生命周期不能超越整体,或者说不能脱离整体而存在.组合关系的“部分”,是不能在整体之间进行共享的.如人和眼睛的关系: 看完上面

Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别

在C++中,类与类之间的关系大概有四种,分别为继承,关联,聚合,和组合.其中继承我们大家应该都比较熟悉,因为是C++的三大特性继承Inheritance,封装Encapsulation,和多态Polymorphism之一. 继承Inheritance:是指一个类(子类)来继承另一个类(基类),并增加自己的功能,可以通过重写基类中的函数来实现.可以将继承理解成“IS A”的关系,比如A cat "IS A" animal, or A car "IS A" vehicl

聚合与组合的区别

据作者的个人理解,关系的强度:依赖<关联<聚合<组合.其实这四个名词只是为了描述类之类关系的紧密的程度而做的区分. 依赖  意在说明2个类存在关系,一般Java语言中体现为局域变量.方法的形参,或者对静态方法的调用: 关联一般是一个类持有另一个类作成员变量来体现,只说明类与类之前是有联系的,至于他们的关系是聚合还是组合,还要看业务和表现形式.Both aggregation and composition are special kinds of associations. 聚合,聚合关

c++ 继承和组合的区别

1.什么是继承 A继承B,说明A是B的一种,并且B的所有行为对A都有意义 eg:A=WOMAN B=HUMAN A=鸵鸟 B=鸟 (不行),因为鸟会飞,但是鸵鸟不会. 2.什么是组合 若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B. 例如眼(Eye).鼻(Nose).口(Mouth).耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye.Nose.Mouth.Ear组合而成,不是派生而成 3.继承的优点和缺点 优点: 容易进行新

JAVA中的聚集和组合的区别和联系

选自<JAVA语言程序设计-基础篇(原书第8版)> 定义:一个对象可以包含另一个对象.这两个对象之间的关系称为组合(composition). 组合实际上是聚集关系的一种特殊形式.聚集模拟了具有(has-a)关系,表示两个对象之间的归属关系.归属关系中的所有者对象称为聚集对象(aggregation object),而它的类称为聚集类(aggregating class).归属关系中的从属对象称为被聚集类(aggregated object),而它的类被称为被聚集类(aggregated cl