您的位置:首页 > 其它

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

2012-03-03 22:21 288 查看

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

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

[code]
[code]#ifdefined(_PTHREADS)&&!defined(_NOTHREADS)

#define__STL_PTHREADS

#endif


#ifdefined(_UITHREADS)&&!defined(_PTHREADS)&&!defined(_NOTHREADS)

#define__STL_UITHREADS

#endif


#ifdefined(__sgi)&&!defined(__GNUC__)

#include<standards.h>

#if!defined(_BOOL)

#define__STL_NO_BOOL

#endif

#ifdefined(_MIPS_SIM)&&_MIPS_SIM==_ABIO32

#define__STL_STATIC_CONST_INIT_BUG

#endif

#ifdefined(_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

[/code]
[/code]
曾经菜鸟和现在依然还是菜鸟的我

,对于这个满眼的#ifdef,#ifndef,#define,#endif,心里犯怵。我擦,这是神马鸟东西啊

!其实,这些是条件编译。对于不同平台,许多的参数定义都不是不同,那么条件编译就是对付跨平台的炸弹,炸毁平台之间的藩篱。

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


[code]
[code]#ifndefJSON_AUTOLINK_H_INCLUDED

#defineJSON_AUTOLINK_H_INCLUDED


.......


#endif//JSON_AUTOLINK_H_INCLUDED

[/code]
[/code]
话说这样是为了解决重复定义的问题

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

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

看看以下格式:


[code]
[code]#ifdef标识符


程序段1


#else


程序段2


#endif

[/code]
[/code]
那么,我们在config文件中就可以来选择说,要编译那个程序段。这是不是很爽呢?

我不用写两份,只写一份,然后编译的时候调整以下就好了。

例如下面的代码




[code]
[code]#ifdefJSON_VALUE_USE_INTERNAL_MAP

classValueAllocator;

classValueMapAllocator;

classValueInternalLink;

classValueInternalArray;

classValueInternalMap;

#endif//#ifdefJSON_VALUE_USE_INTERNAL_MAP

[/code]
[/code]
我在config文件中没有#defineJSON_VALUE_USE_INTERNAL_MAP的时候,上面这段代码是被忽略的

。当我在config文件中这样写:


[code]
[code]#defineJSON_USE_EXCEPTION1


#defineJSON_VALUE_USE_INTERNAL_MAP//增加了这个之后,整个项目中的JSON_VALUE_USE_INTERNAL_MAP这个部分就可以进行编译了


#ifdefJSON_IN_CPPTL

#include<cpptl/config.h>

#ifndefJSON_USE_CPPTL

#defineJSON_USE_CPPTL1

#endif

#endif

......

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

内联函数多帅啊,不好好用可惜的说。

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

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

#define__STL_PTHREADS

#endif

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

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



参考文献:

1.《C语言程序设计》

2.《C和指针》

3.《C专家编程》

C/C++基础知识汇编

C/C++基础知识总结

指针解析(三)(原)

posted@2012-03-0303:56云端小飞象cg阅读(579)|评论(8)编辑

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

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

指针解析(二)(原)

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

指针解析(一)(原)

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

struct结构体解析(原)

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

void和void指针解析(原)

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

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

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

变长数组解析(原)

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

intmain(intargc,char*argv[])详解(原)

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

sizeof()解析(原)

posted@2012-02-0212:43云端小飞象cg阅读(295)|评论(5)编辑
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: