欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-05 14:26:48
我们在看一些开源的源代码的时候,经常会看到如下情景: # if defined(_pthreads) && !defined(_nothreads) #&nbs...

我们在看一些开源的源代码的时候,经常会看到如下情景:
# 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 www.2cto.com
 
#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{},理解起来难度不大。反正好好看就问题不大了。
    最后,本文有点像代码贴。文字的部分不多,用贴代码来理解。说的不好,请大牛们指正,谢谢了 。

 

摘自  云端小飞象cg