#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专家编程》

转载于:https://www.cnblogs.com/ComputerG/archive/2012/03/02/2377726.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这10项创新技术正在引领零售业数字化转型

来源&#xff1a;资本实验室摘要&#xff1a;随着近几年电子商务的快速发展&#xff0c;全球实体零售业纷纷出现业绩下滑的现象&#xff0c;裁员、闭店、抛售成为一些传统零售巨头短期自救的方式&#xff0c;但这些方式却只能治标不治本&#xff0c;无法解决长期以来传统商业模…

内网穿透 --- frp、termite

​中文文档&#xff1a;https://github.com/fatedier/frp/blob/dev/README_zh.md 手机frp内网穿透搭建随身携带的服务器&#xff1a;https://blog.csdn.net/sinat_27938829/article/details/73604722 软路由 通过 Openwrt 自带的 Frp 插件&#xff1a;https://zhuanlan.zhihu.c…

C++ Primer 第11章 习题11.16

//11.16.cpp //使用copy算法将一个文件的内容写到标准输出中 #include<iostream> #include<cstdlib> #include<fstream> #include<string> #include<iterator> #include<algorithm> using namespace std;int main() {string fileName;//输…

熵最大导致智能?

来源&#xff1a;陶勇科学网博客摘要&#xff1a;20世纪50年代开始&#xff0c;现代宏观经济学在研究经济增长时&#xff0c;发现了一个神秘的变量“技术进步&#xff08;或者知识&#xff09;A”&#xff0c;这个变量所带来的经济增长被称作“索洛剩余”。2010年时笔者在Physi…

JQuery 方法查询大全

From&#xff1a;https://www.cnblogs.com/zengjie123/p/4893546.html jQuery 参考手册 - 选择器&#xff1a;https://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 选择器&#xff1a;https://www.runoob.com/jquery/jquery-ref-selectors.html 一、核心 $ 是 jqu…

数据库中char, varchar, nvarchar的差异

1. char固定长度&#xff0c;最长n个字符。2. varchar最大长度为n的可变字符串。&#xff08;n为某一整数&#xff0c;不同数据库&#xff0c;最大长度n不同&#xff09;char和varchar区别&#xff1a;varchar必char节省空间&#xff0c;但在效率上比char稍微差一些。说varchar…

快速转 TypeScript 指南

From&#xff1a;https://segmentfault.com/a/1190000040582994 TypeScript 教程&#xff1a;https://www.runoob.com/typescript/ts-tutorial.html TypeScript 入门教程&#xff1a;http://ts.xcatliu.com/ TypeScript 超详细入门教程&#xff08;上&#xff09;&#xff1a;…

对一句正则表达式的理解

在《Python基础教程》的第198页上看到这样一句&#xff1a; re.sub(emphasis_pattern, r<em>\1</em>, Hello, *world*!) 其中&#xff1a;emphasis_pattern r\*([^\*])\* 结果为&#xff1a;Hello, <em>world</em>! 对emphasis_pattern r\*([^\*])\*…

城市大脑建设的3个误区,大脑模型的分歧是关键

作者&#xff1a;刘锋 互联网进化论作者 计算机博士城市大脑是目前智慧城市建设热门的概念&#xff0c;因该说这是一个在中国本土诞生的科技概念和技术模型&#xff0c;作为一个新的领域&#xff0c;城市大脑究竟如何建设&#xff0c;事实上存在了两种不同的发展路径&#xff0…

关于mysql修改密码后的问题

今天心血来潮&#xff0c;把连接mysql的密码改了&#xff0c;wampSever重启后就遇到“phpMyAdmin 试图连接到 MySQL 服务器&#xff0c;但服务器拒绝连接。您应该检查 config.inc.php 中的主机、用户名和密码&#xff0c;并且确定这些信息与 MySQL 服务器的管理员所给出的信息一…

JavaScript 和 typeScript 中的 import、from

From&#xff1a;https://segmentfault.com/a/1190000018249137?utm_sourcetag-newest Github - allowSyntheticDefaultImports should be the default?exports、module.exports和export、export deault到底是咋回事JavaScript 中有多种 export 的方式&#xff0c;而 TypeSc…

深度丨建立合资公司,深度参与运营:详解景驰的无人驾驶生意经

来源&#xff1a;亿欧摘要&#xff1a; 对于景驰科技而言&#xff0c;最终实现商业价值的做法绝对不仅仅是把改装好的无人车卖出高价。在该公司看来&#xff0c;切入无人驾驶需求最旺盛的出租车市场&#xff0c;与出行服务公司、主机厂乃至政府产业基金成立合资公司&#xff0c…

使用SQL Server存储ASP.NET Session变量

创建和配置ASP.NET Session状态数据库在基于NLB&#xff08;网络负载平衡&#xff09;环境下的ASP.NET Web应用程序开发&#xff0c;我们需要将Session存储在数据库中供多个Web应用程序调用&#xff0c;以下为配置方法及注意事项。1.创建用于存储ASP.NET Session的数据库&#…

Linux工具快速教程

From&#xff1a;https://linuxtools-rst.readthedocs.io/zh_CN/latest/index.html 博客&#xff1a;http://blog.me115.comGithub地址&#xff1a;https://github.com/me115/linuxtools_rst分为三个部分&#xff1a; 第一部分为基础篇&#xff0c;介绍我们工作中常用的工具的…

学界 | DeepMind想用IQ题测试AI的抽象思维能力,进展还不错

来源&#xff1a;大数据文摘摘要&#xff1a;抽象理解能力一直是人类引以为豪的智慧来源。阿基米德基于对物体体积的抽象理解&#xff0c;悟到了物体的体积与物体浮力之间的关系。这就是抽象推理的魔力。基于神经网络的机器学习模型取得了惊人的成绩&#xff0c;但是测量其推理…

frida hook so层、protobuf 数据解析

手机安装 app &#xff0c;设置代理&#xff0c;然后开始抓包。 发现数据没法解密&#xff0c;查看请求的 url 是 http://lbs.jt.sh.cn:8082/app/rls/monitor&#xff0c;使用 jadx 反编译 app 后搜索这个 url&#xff08;提示&#xff1a;可以只搜索 url 中一部分&#xff0c;…

PHP session的工作原理

PHP SESSION原理我们知道&#xff0c;session是在服务器端保持用户会话数据的一种方法&#xff0c;对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议&#xff0c;服务器响应完之后就失去了与浏览器的联系&#xff0c;最早&#xff0c;Netscape将cookie引入浏览器…

大数据技术与应用解读及案例分析(PPT)

来源&#xff1a;网络大数据摘要&#xff1a;大数据是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。大数据就是未来的石油。未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学…

pywin32库 : Python 操作 windows 系统 API

Python 模块虽多&#xff0c;但也不可能满足所有需求。而且&#xff0c;模块为了便于使用&#xff0c;通常都封装过度&#xff0c;有些功能无法灵活使用&#xff0c;必须直接调用Windows API 来实现。要完成这一目标&#xff0c;有两种办法&#xff0c;一种是使用 C 编写 Pytho…

JVM内存管理:深入Java内存区域与OOM

Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙&#xff0c;墙外面的人想进去&#xff0c;墙里面的人却想出来。 概述&#xff1a; 对于从事C、C程序开发的开发人员来说&#xff0c;在内存管理领域&#xff0c;他们即是拥有最高权力的皇帝又是执行最基础工作的劳动…