好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

#ifdef,#ifndef,#define,#endif解析

#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)   编辑

 

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

 

posted @  2012-03-02 20:26  云端小飞象cg 阅读(835) |  评论 (4)   编辑

 

指针解析(二)(原)

 

posted @  2012-02-27 13:29  云端小飞象cg 阅读(729) |  评论 (11)   编辑

 

指针解析(一)(原)

 

posted @  2012-02-26 02:06  云端小飞象cg 阅读(1220) |  评论 (14)   编辑

 

struct 结构体解析(原)

 

posted @  2012-02-22 23:32  云端小飞象cg 阅读(1115) |  评论 (5)   编辑

 

void和void指针解析(原)

 

posted @  2012-02-22 14:55  云端小飞象cg 阅读(961) |  评论 (5)   编辑

 

小数点输出精度与iomanip解析(原)

 

posted @  2012-02-08 10:23  云端小飞象cg 阅读(99) |  评论 (1)   编辑

 

变长数组解析(原)

 

posted @  2012-02-07 22:33  云端小飞象cg 阅读(125) |  评论 (0)   编辑

 

int main(int argc,char* argv[])详解(原)

 

posted @  2012-02-04 11:40  云端小飞象cg 阅读(193) |  评论 (1)   编辑

 

sizeof()解析(原)

 

posted @  2012-02-02 12:43  云端小飞象cg 阅读(295) |  评论 (5)   编辑

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于#ifdef,#ifndef,#define,#endif解析的详细内容...

  阅读:48次