当前位置: 首页 > news >正文

C语言 ——— 学习并使用条件编译指令

目录

何为条件编译指令

常见的条件编译指令

学习条件编译指令

使用条件编译指令

在程序预编译阶段,条件编译指令的代码转换

多分支的条件编译指令


何为条件编译指令

在编译一个程序的时候,如果要将一条语句(一组语句)选择编译或者放弃时,就使用条件编译指令


常见的条件编译指令

#if 常量表达式// ……
#endif

学习条件编译指令

#if 后面是一个常量表达式,当常量表达式为真时(非0时)就执行条件编译中的语句,为假时就不执行 


使用条件编译指令

代码演示(为真时):

#include<stdio.h>
int main()
{#if 1printf("hello world\n");
#endifreturn 0;
}

1 为真,所以要执行 #if 内的代码

代码验证(为真时):

代码演示(为假时):

#include<stdio.h>
int main()
{#if 0printf("hello world\n");
#endifreturn 0;
}

0 为假,就不会执行 #if 内的代码

代码验证(为假时):


在程序预编译阶段,条件编译指令的代码转换

代码演示(为真时):

#if 1printf("hello world\n");
#endif

#if 后面的常量表达式为真时,在程序预编译阶段就会把 #if 1 和 #endif 删除,只留下要执行的代码,以上代码就会转换为以下代码:

printf("hello world\n");

代码演示(为假时):

#if 0printf("hello world\n");
#endif

#if 后面的常量表达式为假时,在程序预编译阶段就会把 #if 1 和 #endif 还有它们所包含的代码全部删除,也就是会将 priintf 函数从程序中删除

结论:

if 等判断语句和 #if 条件编译指令要区分开来,if语句条件为假时只是不执行if内的语句,而 #if 为假时是直接删除 #if 中的语句


多分支的条件编译指令

代码演示:

#define M 0int main()
{#if (M == 1)printf("hello\n");
#elif (M == 2)printf("world\n");
#elseprintf("hello world\n");
#endifreturn 0;
}

多分支结构分析:

和 if 、else if 语句类似,#if 和 #elif 中的常量表达式都为假,所以只会执行 #else 中的表达式,并且不论是但分支还是多分支,在末尾都要加上 #endif

代码验证:

且在程序预编译阶段,也是会将不执行的代码删除,只保留执行的代码

结论:

条件编译指令多用于跨平台性的代码上

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【佳学基因检测】如何使用Letsencrypt对一个网站进行加密?
  • 【Python常用库_1】网络安全清洁专家——Bleach
  • TiDB-从0到1【完结】
  • 细致刨析JDBC ① 基础篇
  • Windows10 如何配置python IDE
  • Apple Intelligence深夜炸场!苹果发布4颗自研芯片,iPhone/iWatch/AirPods大升级
  • 专业级PDF编辑神器大比拼:效率与功能并重的选择
  • 【日常记录-Java】SpringBoot中使用无返回值的异步方法
  • Docker基础-Docker Compose使用
  • 大数据与人工智能:脑科学与人工神经网络ANN
  • 随手记:uniapp小程序登录方式和小程序使用验证码登录
  • Flutter动画—涟漪效果
  • arcgis Feature Server的新增、更新、删除
  • 使用 Grype 检查 .jar 包中的漏洞
  • Python 调用手机摄像头
  • gulp 教程
  • Javascript设计模式学习之Observer(观察者)模式
  • JS 面试题总结
  • OSS Web直传 (文件图片)
  • PhantomJS 安装
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Redis中的lru算法实现
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SQLServer插入数据
  • XForms - 更强大的Form
  • Zsh 开发指南(第十四篇 文件读写)
  • 复杂数据处理
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 排序算法学习笔记
  • 删除表内多余的重复数据
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 我这样减少了26.5M Java内存!
  • 消息队列系列二(IOT中消息队列的应用)
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $$$$GB2312-80区位编码表$$$$
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (70min)字节暑假实习二面(已挂)
  • (苍穹外卖)day03菜品管理
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (回溯) LeetCode 40. 组合总和II
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (一)VirtualBox安装增强功能
  • (转)创业的注意事项
  • .NET C# 使用GDAL读取FileGDB要素类
  • .net core控制台应用程序初识
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net 代码性能 - (1)
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET4.0并行计算技术基础(1)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • /etc/shadow字段详解
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?