热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

#ifdefvs#ifdefined的差异

目录前言正文一、相同点二、不同点差异一、差异二、结论前言C语法中经常会使用很多预处理命令,当编译器将C代码翻译成汇编的过程中,首先会通过预

 

目录

前言

正文

一、相同点

二、不同点

差异一、

差异二、

结论



前言

C++语法中经常会使用很多预处理命令,当编译器将C++代码翻译成汇编的过程中,首先会通过预处理命令来对代码的内容和编译方式进行调整。预处理指令就是去配置预处理器的各种各样的指令,一般来说,预处理命令都会以“#”开头。比如,我们之前用到的#include就是其中一个预处理命令。除此之外,还有 #pragma,#define,#ifdef,#ifndef,#endif,#if defined等。其中,#ifdef 和 #if defined 就是我们今天要对比的两个指令。

正文

一、相同点

1. #ifdef 和 #if defined 都是C/C++语言特有的预处理命令。

2. #ifdef 和 #if defined 都可以用于宏变量的声明的判断,用来做不同逻辑的处理。

二、不同点


差异一、

#ifdef 只能用于单表达式判断,后者(#if defined)可以有多个逻辑判断。

下面通过两个实例来说明,使用 #ifdef 处理是与非的逻辑代码:

#ifdef  XXX....#else....#endif

使用 #if defined 处理多个 case 或者不同条件的逻辑代码:

#if defined XXX...
#elif defined YYY
...#elif defined ZZZ 
...
#endif

差异二、

#ifdef 只能用于单逻辑判断,也就是单个宏变量是否声明的判断,而后者(#if defined)可以组成复杂的预编译条件。

#if defined (XXX) && defined (YYY)
...#endif

结论

综上所述,当我们想要判断单个宏是否被定义时,使用 #ifdef 和 #if defined 的效果是一样的,但是当我们要判断复杂的条件和情况时,就只能用 #if defined。其实,#ifdef 是 #if defined 的简化版,只是判断单个宏是否被定义时可以用 #ifdef,其它复杂条件和情况可以用 #if defined。尽管, #ifdef 和 #if defined 两个预处理命令有很多不一样的地方,但是在使用过程,它们有一个共同需要注意的地方就是要搭配 #endif 预处理命令一起使用。


作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解。同时也是 CSDN 博客专家(博客之星)、华为云享专家(共创编辑、十佳博主)、51CTO社区编辑、InfoQ 签约作者,欢迎关注我分享更多干货!😄 



推荐阅读
  • 说明:主要是基于ghostyu网友整理的《 armmini2440基于v4l2ffmpegx264的视频远程监控》。自己做了一遍,遇到不少问题,就整理记录下来。 1、平台硬件:ar ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文总结了AAC解码的过程,并介绍了几个解码版本,包括FAAD/2、FFmpeg自带的解码器以及opencore的opencore-aacdec。作者选择了FAAD作为解码器,并通过编译和运行测试确认解码无问题。然而,作者在输出过程中遇到了时长增加一倍的问题,通过修改代码实现了单通道输出,并解决了时长异常的问题。最终,解码后的声音质量接近无损。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
  • 本文介绍了在Java中检查字符串是否仅包含数字的方法,包括使用正则表达式的示例代码,并提供了测试案例进行验证。同时还解释了Java中的字符转义序列的使用。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
author-avatar
欢乐天天快乐一生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有