最近在看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里面两者一起用的情况确实有点不解,其实是两种缺点都包含了吧,又不是优点整合吧

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

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

    转载:http://blog.csdn.net/ocean181/article/details/6117369 UML的关联(Association), 聚合(Aggregation), 组合(Co ...

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

    在学习面向对象设计对象关系时,依赖.关联.聚合和组合这四种关系之间区别比较容易混淆.特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境.特定情景等. 依赖(Dependency)关系是类与 ...

  3. java中继承和组合的区别

    子类继承父类,父类的所有属性和方法都可以被子类访问和调用.组合是指将已存在的类型作为一个新建类的成员变量类型,又叫"对象持有". 通过组合和继承,都可以实现系统功能的重用和代码的复 ...

  4. C++继承与组合的区别

    C++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及到两个概念,一个是继承(Inheritance),一个是组合(Composition).因为二者有一定的相似性,往往令程序 ...

  5. UML类图聚集与组合的区别

    http://blog.csdn.net/zwf0713/article/details/2025922 设计模式中组合和聚集好像挺相似,但有一定区别. 1-在图上的区别是,聚集用空心,组合用实心: ...

  6. 【Java】聚合和组合的区别

    组合:部分与整体是与生俱来的,部分的存在依赖于整体.比如人与人的某个器官,人一出生,器官就在,人死亡,器官也就没了意义. 聚合:你与你的电脑(或者其它物品),电脑是属于你的吧,但是你是一出生就拥有了电 ...

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

    选自<JAVA语言程序设计-基础篇(原书第8版)> 定义:一个对象可以包含另一个对象.这两个对象之间的关系称为组合(composition). 组合实际上是聚集关系的一种特殊形式.聚集模拟 ...

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

    在C++中,类与类之间的关系大概有四种,分别为继承,关联,聚合,和组合.其中继承我们大家应该都比较熟悉,因为是C++的三大特性继承Inheritance,封装Encapsulation,和多态Poly ...

  9. c++ 继承和组合的区别

    .什么是继承 A继承B,说明A是B的一种,并且B的所有行为对A都有意义 eg:A=WOMAN B=HUMAN A=鸵鸟 B=鸟 (不行),因为鸟会飞,但是鸵鸟不会. .什么是组合 若在逻辑上A是B的“ ...

随机推荐

  1. lsll 加载段限长指令

    static inline unsigned long get_limit(unsigned long segment) {  unsigned long __limit;  __asm__(&quo ...

  2. Recovering deleted Records

    [原文] recovering-deleted-records Solution That requires an actual timestamp (or date), you're passing ...

  3. 在dreamweaver上面制作表格

    开始有点犯二,准备一行一行敲,五六十行,人都得敲疯,还容易出错...... 直接从wps复制粘贴到设计里面,立马就出来了,费那事干嘛,哎,工具还是用的不熟

  4. 虚拟机安装的UBUNTU怎么全屏

    虚拟机下面安装了ubuntu系统,显示的屏幕只有那么一小块儿,不知道如何才能全屏,那么如何全屏呢?且看下面经验. 步骤阅读   百度经验:jingyan.baidu.com 方法/步骤 1 打开虚拟机 ...

  5. ACCP7.0-S2-复习自测-15测试分析

    3.下列关于java中集合接口的说法不正确的是(). A: B: C: D: 正确答案是 D  4. (选择一项) A: B: C: D: 正确答案是 D  5. (选择一项) A: B: C: D: ...

  6. bzoj2438[中山市选2011]杀人游戏

    Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面, 查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他 认识的人, ...

  7. 适配ipone5

    PROJECT和TARGETS都需要设置

  8. jQuery $.each用法

    以下内容非原创,来自百度文库http://wenku.baidu.com/view/4796b6145f0e7cd18425368e.html 好文要顶 关注我 收藏该文   mabel_on_lin ...

  9. java类型转换

    //java类型转换public class Demo2 { public static void main(String[] args){ int num1 = 55; int num2 =77; ...

  10. js checkbox 选中判断

    var isSelect = ""; isSelect = $("#tblImgList" + " input[type='checkbox']&qu ...