zoukankan      html  css  js  c++  java
  • #ifdef,#ifndef,#define,#endif解析

    #ifdef,#ifndef,#define,#endif解析(原)

       我们在看一些开源的源代码的时候,经常会看到如下情景:

    # if defined(_PTHREADS) && !defined(_NOTHREADS)
    #     define __STL_PTHREADS
    # endif
     
    # if defined(_UITHREADS) && !defined(_PTHREADS) && !defined(_NOTHREADS)
    #     define __STL_UITHREADS
    # endif
     
    # if defined(__sgi) && !defined(__GNUC__)
    #   include <standards.h>
    #   if !defined(_BOOL)
    #     define __STL_NO_BOOL
    #   endif
    #   if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32
    #     define __STL_STATIC_CONST_INIT_BUG
    #   endif
    #   if defined(_WCHAR_T_IS_KEYWORD)
    #     define __STL_HAS_WCHAR_T
    #   endif
    #  .......
    #   if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS)
    #     define __SGI_STL_USE_AUTO_PTR_CONVERSIONS
    #   endif
    # endif

        曾经菜鸟和现在依然还是菜鸟的我尴尬,对于这个满眼的#ifdef,#ifndef,#define,#endif,心里犯怵。我擦,这是神马鸟东西啊恶魔!其实,这些是条件编译。对于不同平台,许多的参数定义都不是不同,那么条件编译就是对付跨平台的炸弹,炸毁平台之间的藩篱。

        先说说#ifndef,#define,#endif,我们对此十分的熟悉。在我们项目的许多头文件里面,我们经常是这样:

    #ifndef JSON_AUTOLINK_H_INCLUDED
    #define JSON_AUTOLINK_H_INCLUDED
     
    .......
     
    #endif // JSON_AUTOLINK_H_INCLUDED

        话说这样是为了解决重复定义的问题太阳。例如:我在a.h中定义了class A,在b.h中也定义了class A,那么在c.cpp中都包含了a.h和b.h,按照包含头函数的习惯,这个class A是重复定义了。为了防止这样情况的出现,就出现上面的做法。

        在来说说,#ifdef和#endif。一般情况下,源程序中所有的行都参加编译。但是,有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。那么怎么使用呢?恶魔看看以下格式:

    #ifdef 标识符
     
    程序段1
     
    #else
     
    程序段2
     
    #endif

        那么,我们在config文件中就可以来选择说,要编译那个程序段。这是不是很爽呢?大笑我不用写两份,只写一份,然后编译的时候调整以下就好了。

        例如下面的代码太阳

    #ifdef JSON_VALUE_USE_INTERNAL_MAP
       class ValueAllocator;
       class ValueMapAllocator;
       class ValueInternalLink;
       class ValueInternalArray;
       class ValueInternalMap;
    #endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP

        我在config文件中没有#define JSON_VALUE_USE_INTERNAL_MAP的时候,上面这段代码是被忽略的破碎的心。当我在config文件中这样写:

    # define JSON_USE_EXCEPTION 1
     
    # define JSON_VALUE_USE_INTERNAL_MAP    // 增加了这个之后,整个项目中的JSON_VALUE_USE_INTERNAL_MAP这个部分就可以进行编译了
     
    # ifdef JSON_IN_CPPTL
    #  include <cpptl/config.h>
    #  ifndef JSON_USE_CPPTL
    #   define JSON_USE_CPPTL 1
    #  endif
    # endif
    ......

        #define这个东西可以定义宏,参数之类的,也可以作为条件编译中的阀门,例如上面的例子。宏就不介绍了。我不大喜欢,因为我可以用内联函数来代替。太阳内联函数多帅啊,不好好用可惜的说。

        在次将眼光转到本文开始的地方,有许多的条件编译语句,有些需要解释。

    # if defined(_PTHREADS) && !defined(_NOTHREADS)    // 假如有定义_PTHREADS和没有定义_NOTHREADS,那么就定义__STL_PTHREADS吧。听起来有点囧!
    #     define __STL_PTHREADS
    # endif

        这种条件编译语句很像if(){}else{},理解起来难度不大。反正好好看就问题不大了。

        最后,本文有点像代码贴。文字的部分不多,用贴代码来理解。说的不好,请大牛们指正,谢谢了吐舌鬼脸

    参考文献:

    1. 《C语言程序设计》

    2. 《C和指针》

    3. 《C专家编程》

    C/C++基础知识汇编

    C/C++基础知识总结
     
    posted @ 2012-03-03 03:56 云端小飞象cg 阅读(579) | 评论 (8) 编辑
     
     
     
    posted @ 2012-02-27 13:29 云端小飞象cg 阅读(729) | 评论 (11) 编辑
     
     
    posted @ 2012-02-26 02:06 云端小飞象cg 阅读(1220) | 评论 (14) 编辑
     
     
    posted @ 2012-02-22 23:32 云端小飞象cg 阅读(1115) | 评论 (5) 编辑
     
     
    posted @ 2012-02-22 14:55 云端小飞象cg 阅读(961) | 评论 (5) 编辑
     
     
    posted @ 2012-02-08 10:23 云端小飞象cg 阅读(99) | 评论 (1) 编辑
     
     
    posted @ 2012-02-07 22:33 云端小飞象cg 阅读(125) | 评论 (0) 编辑
     
     
    posted @ 2012-02-04 11:40 云端小飞象cg 阅读(193) | 评论 (1) 编辑
     
     
    posted @ 2012-02-02 12:43 云端小飞象cg 阅读(295) | 评论 (5) 编辑
  • 相关阅读:
    XAF应用开发教程(六)控制器
    XAF应用开发教程(五)验证模块
    XAF应用开发教程(四)应用程序模型
    XAF应用开发教程(三)业务对象模型之引用类型与关联关系
    XAF应用开发教程(二)业务对象模型之简单类型属性
    XAF应用开发教程(一) 创建项目
    C#
    C# 实例化类的执行顺序
    C#中?的相关使用
    angular过滤器 -- 关键字高亮显示
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2378776.html
Copyright © 2011-2022 走看看