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

  • 相关阅读:
    开启Nginx代理HTTPS功能
    Linux查找运行程序主目录
    Linux命令记录
    Eclipse 安装 阿里P3C编码规范插件
    Elasticsearch(ES)(版本7.x)数据更新后刷新策略RefreshPolicy
    JS小技巧
    改变窗口或屏幕大小时调用function
    毛玻璃效果 | fifter
    position: sticky;不一样失效原因
    mysql 修改密码问题 5.6,5.7 (配置方式的skip-grant-tables可能不行,推荐命令行方式)
  • 原文地址:https://www.cnblogs.com/riversHahaha/p/4570104.html
Copyright © 2020-2023  润新知