#ifdef,#ifndef,#define,#endif解析(原)
2012-03-02 20:26
260 查看
我们在看一些开源的源代码的时候,经常会看到如下情景:
曾经菜鸟和现在依然还是菜鸟的我
,对于这个满眼的#ifdef,#ifndef,#define,#endif,心里犯怵。我擦,这是神马鸟东西啊
!其实,这些是条件编译。对于不同平台,许多的参数定义都不是不同,那么条件编译就是对付跨平台的炸弹,炸毁平台之间的藩篱。
先说说#ifndef,#define,#endif,我们对此十分的熟悉。在我们项目的许多头文件里面,我们经常是这样:
话说这样是为了解决重复定义的问题
。例如:我在a.h中定义了classA,在b.h中也定义了classA,那么在c.cpp中都包含了a.h和b.h,按照包含头函数的习惯,这个classA是重复定义了。为了防止这样情况的出现,就出现上面的做法。
在来说说,#ifdef和#endif。一般情况下,源程序中所有的行都参加编译。但是,有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。那么怎么使用呢?
看看以下格式:
那么,我们在config文件中就可以来选择说,要编译那个程序段。这是不是很爽呢?
我不用写两份,只写一份,然后编译的时候调整以下就好了。
例如下面的代码
:
我在config文件中没有#defineJSON_VALUE_USE_INTERNAL_MAP的时候,上面这段代码是被忽略的
。当我在config文件中这样写:
#define这个东西可以定义宏,参数之类的,也可以作为条件编译中的阀门,例如上面的例子。宏就不介绍了。我不大喜欢,因为我可以用内联函数来代替。
内联函数多帅啊,不好好用可惜的说。
在次将眼光转到本文开始的地方,有许多的条件编译语句,有些需要解释。
这种条件编译语句很像if(){}else{},理解起来难度不大。反正好好看就问题不大了。
最后,本文有点像代码贴。文字的部分不多,用贴代码来理解。说的不好,请大牛们指正,谢谢了
。
参考文献:
1.《C语言程序设计》
2.《C和指针》
3.《C专家编程》
#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
曾经菜鸟和现在依然还是菜鸟的我
,对于这个满眼的#ifdef,#ifndef,#define,#endif,心里犯怵。我擦,这是神马鸟东西啊
!其实,这些是条件编译。对于不同平台,许多的参数定义都不是不同,那么条件编译就是对付跨平台的炸弹,炸毁平台之间的藩篱。
先说说#ifndef,#define,#endif,我们对此十分的熟悉。在我们项目的许多头文件里面,我们经常是这样:
#ifndefJSON_AUTOLINK_H_INCLUDED
#defineJSON_AUTOLINK_H_INCLUDED
.......
#endif//JSON_AUTOLINK_H_INCLUDED
话说这样是为了解决重复定义的问题
。例如:我在a.h中定义了classA,在b.h中也定义了classA,那么在c.cpp中都包含了a.h和b.h,按照包含头函数的习惯,这个classA是重复定义了。为了防止这样情况的出现,就出现上面的做法。
在来说说,#ifdef和#endif。一般情况下,源程序中所有的行都参加编译。但是,有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。那么怎么使用呢?
看看以下格式:
#ifdef标识符
程序段1
#else
程序段2
#endif
那么,我们在config文件中就可以来选择说,要编译那个程序段。这是不是很爽呢?
我不用写两份,只写一份,然后编译的时候调整以下就好了。
例如下面的代码
:
#ifdefJSON_VALUE_USE_INTERNAL_MAP
classValueAllocator;
classValueMapAllocator;
classValueInternalLink;
classValueInternalArray;
classValueInternalMap;
#endif//#ifdefJSON_VALUE_USE_INTERNAL_MAP
我在config文件中没有#defineJSON_VALUE_USE_INTERNAL_MAP的时候,上面这段代码是被忽略的
。当我在config文件中这样写:
#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
......
#define这个东西可以定义宏,参数之类的,也可以作为条件编译中的阀门,例如上面的例子。宏就不介绍了。我不大喜欢,因为我可以用内联函数来代替。
内联函数多帅啊,不好好用可惜的说。
在次将眼光转到本文开始的地方,有许多的条件编译语句,有些需要解释。
#ifdefined(_PTHREADS)&&!defined(_NOTHREADS)//假如有定义_PTHREADS和没有定义_NOTHREADS,那么就定义__STL_PTHREADS吧。听起来有点囧!
#define__STL_PTHREADS
#endif
这种条件编译语句很像if(){}else{},理解起来难度不大。反正好好看就问题不大了。
最后,本文有点像代码贴。文字的部分不多,用贴代码来理解。说的不好,请大牛们指正,谢谢了
。
参考文献:
1.《C语言程序设计》
2.《C和指针》
3.《C专家编程》
相关文章推荐
- #ifdef,#ifndef,#define,#endif解析
- C/C++中常出现的#ifndef,#define,#endif解析
- #ifdef #ifndef #define,#endif解析
- #pragma once 与#ifndef,#define,#endif的差别 、重复定义等相关问题
- C++ 头文件中为何添加了#ifndef #define #endif还会出现变量重复定义的问题
- #ifndef #define #endif用法
- #ifndef, #define, #endif 作用
- #ifndef与#define与#endif
- #ifndef#define#endif的用法
- 头文件为什么要加#ifndef #define #endif
- #ifndef #define #endif用法
- #ifndef #define #endif
- 如何避免重复包含一个文件? #ifndef、#define、#endif
- #pragma once 和 #ifndef,#define,#endif
- #ifndef#define#endif的用法(整理) .
- [转] #ifndef#define#endif的用法(整理) 原作者:icwk
- c++里的#ifndef,#define以及那#endif
- #ifndef,#define,#endif的含义和用法
- #ifndef#define#endif防止头文件重复包含, 你不是真的懂
- c++里的#ifndef,#define以及那#endif