#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…

熵最大导致智能?

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

快速转 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;…

城市大脑建设的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的数据库&#…

学界 | 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;…

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

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

pywin32库 : Python 操作 windows 系统 API

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

华为秘密作战计划曝光,重注研发AI芯片挑战英伟达,轮值董事长挂帅

雷刚 问耕 发自 凹非寺 量子位 报道 | 公众号 QbitAI摘要&#xff1a;据报道&#xff0c;对于如何把AI引入所有业务&#xff0c;华为内部已经开启了代号为“达芬奇”的作战计划&#xff0c;并且成为华为高层每月一次讨论会的重点议题&#xff0c;也有不少华为高管以“D项目”来…

Python --- ctypes库的使用

ctypes 的官方文档 英文文档&#xff1a;https://docs.python.org/3/library/ctypes.html中文文档&#xff1a;https://docs.python.org/zh-cn/3.10/library/ctypes.html Python--ctypes(数据类型详细踩坑指南&#xff09;&#xff1a;https://zhuanlan.zhihu.com/p/145165873…

机器学习近年来之怪现象

来源&#xff1a;网络大数据人工智能领域的发展离不开学者们的贡献&#xff0c;然而随着研究的进步&#xff0c;越来越多的论文出现了「标题党」、「占坑」、「注水」等现象&#xff0c;暴增的顶会论文接收数量似乎并没有带来更多技术突破。最近&#xff0c;来自卡耐基梅隆大学…

PySide6 : Qt for Python 教程

Qt for Python 教程&#xff1a;https://doc.qt.io/qtforpython/tutorials/index.html 官方文档示例&#xff1a;https://doc.qt.io/qtforpython/examples/index.html Qt for Python 提供了一系列带有演练指南的教程&#xff0c;以帮助新用户入门。 其中一些文档是从 C 移植到…

PySide6 信号、槽

信号与槽的入门应用&#xff08;一&#xff09;&#xff1a;https://blog.csdn.net/jia666666/article/details/81774175 信号与槽的再细分&#xff08;二&#xff09;&#xff1a;https://blog.csdn.net/jia666666/article/details/81774858 信号与槽的高级玩法&#xff08;三…

芯片业又起波澜!博通189亿美元收购遭质疑,股价一度跌近19%

来源&#xff1a;华尔街见闻摘要&#xff1a;如果说博通上次收购高通面临的最大“对手”是特朗普政府&#xff0c;这次收购CA的“对手”可能是华尔街。如果说博通上次收购高通面临的最大“对手”是特朗普政府&#xff0c;这次收购CA的“对手”可能是华尔街。美东时间周三&#…

JavaScript常用技巧专题五

文章目录 一、使用适当的命名和注释来提高代码可读性二、优雅的写条件判断代码2.1、普通的if else2.2、三元运算符2.3、多个if else2.4、switch case2.5、对象写法2.6、Map写法 三、封装条件语句四、函数应该只做一件事五、Object.assign给默认对象赋默认值六、函数参数两个以下…