#ifdef #ifndef #define,#endif解析
来源:互联网 发布:知乎回答 编辑:程序博客网 时间:2024/05/16 04:49
from:http://www.2cto.com/kf/201203/121773.html
我们在看一些开源的源代码的时候,经常会看到如下情景:
# 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#
先说说#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
如果我在该代码文件的开头加上 #define JSON_VALUE_USE_INTERNAL_MAP
则上面的代码就可以被编译。当不需要这段代码的时候就可以将 #define JSON_VALUE_USE_INTERNAL_MAP 这段代码注释掉即可
在一些开源软件中,#define JSON_VALUE_USE_INTERNAL_MAP可能位于config文件中。#define这个东西可以定义宏,参数之类的,也可以作为条件编译中的阀门,例如上面的例子。宏就不介绍了。我不大喜欢,因为我可以用内联函数来代替。 内联函数多帅啊,不好好用可惜的说。
在次将眼光转到本文开始的地方,有许多的条件编译语句,有些需要解释。
# if defined(_PTHREADS) && !defined(_NOTHREADS) // 假如有定义_PTHREADS和没有定义_NOTHREADS,那么就定义__STL_PTHREADS吧。听起来有点囧!
# define __STL_PTHREADS
# endif
这种条件编译语句很像if(){}else{},理解起来难度不大。反正好好看就问题不大了。
最后,本文有点像代码贴。文字的部分不多,用贴代码来理解。说的不好,请大牛们指正,谢谢了 。
0 0
- #ifdef #ifndef #define,#endif解析
- ifndef/define/endif/ifdef
- #define typedef 以及#ifdef #define #ifndef #endif
- #defned typedef 以及#ifdef #define #ifndef #endif
- #ifdef、#ifndef、#define与#endif的使用
- #ifdef #ifndef #endif #define #if #else
- 关于define、ifdef、ifndef、endif的讲解
- #ifndef、#ifdef、#define、#endif的作用
- C语言#ifdef,#ifndef,#endif,#define详解
- #define #if #ifdef #ifndef #endif 的用法
- #ifndef #define #endif #ifdef 避免重复引用
- C/C++预处理指令#define #ifdef #ifndef #endif
- ifndef/define/endif 和 #ifdef 、#if 作用和用法
- C/C++预处理指令 #define,#ifdef,#ifndef,#endif
- c++预处理器概述 #define #ifdef #ifndef #endif
- C/C++预处理指令#define,#ifdef,#ifndef,#endif…
- #ifndef#define#endif 和 ifdef#endif 的用法(整理) 原作者:icwk
- C++头文件之:#ifndef #define #endif ,#ifdef __cplusplus extern "C" { #endif,__declspec(dllimport)
- dom4j读取xml字符串和读取xml文件
- 职业规划之前请认真读读以下19个故事(3)
- Linux设备模型(中)之上层容器
- IBATIS动态SQL
- Tomcat的JVM设置和连接数设置
- #ifdef #ifndef #define,#endif解析
- 正则表达式函数的替换函数
- 内核启动组件式初始化
- Spring事务配置的五种方式
- IOS之同步请求、异步请求、GET请求、POST请求
- linux下tomcat的安装,两个tomcat的配置,并与nginx负载均衡配置
- 关于安卓开发时获取sd卡状态
- uboot学习中发现GCC的特殊code
- Hibernate HQL 数据类型转换