C语言--条件编译(常见的编译指令)

#if(开始(判断条件))+#endif(结束)

条件满足就参与编译,这里是一个判断的语句,当M大于0的时候,打印hehe不然就不打印

或者注释代码也好用

当#if 0的时候 ,也就是大规模的注释代码使用

当然结尾需要加上#endif

———————————————————————————————————————————

 #endif(结束)

条件编译指令都需要#endif来结束

———————————————————————————————————————————

#if defined(判断是否已经被定义,定义了就执行)+#endif(结束)

如果没有定义#define max 那就不打印

如果定义了#define max 那就打印

#if defined(MAX)
// 如果 MAX 已经被定义,则执行这里的代码
printf("hehe\n");
#endif

———————————————————————————————————————————

 #if !defined(判断是否未被定义,未定义执行)+#endif(结束)

#if !defined(MAX)
// 如果 MAX 未定义,则执行这里的代码
printf("hehe\n");
#endif

———————————————————————————————————————————

条件编译的嵌套使用


#if defined(OS_UNIX)
 #ifdef OPTION1
 unix_version_option1();
 #endif
 #ifdef OPTION2
 unix_version_option2();
 #endif
#elif defined(OS_MSDOS)
 #ifdef OPTION2
 msdos_version_option2();
 #endif
#endif


这段代码是使用条件编译来根据不同的操作系统定义来执行不同的代码块。这里的 `OS_UNIX` 和 `OS_MSDOS` 是用来表示不同操作系统的宏,而 `OPTION1` 和 `OPTION2` 可能是与特定操作系统相关的其他宏。
让我们逐行解释代码:
```c
#if defined(OS_UNIX)
```
这行代码检查 `OS_UNIX` 是否被定义。如果当前编译的操作系统是 Unix(包括类Unix系统如Linux、BSD等),那么接下来的代码块会被编译和执行。
```c
 #ifdef OPTION1
 unix_version_option1();
 #endif
```
这段代码首先检查 `OPTION1` 是否被定义。如果在 `OS_UNIX` 定义的文件中定义了 `OPTION1`,那么 `unix_version_option1();` 这行代码会被编译和执行。`OPTION1` 可能是特定于Unix系统的功能或配置选项。
```c
 #ifdef OPTION2
 unix_version_option2();
 #endif
```
这段代码与上一段类似,但它检查 `OPTION2` 是否被定义。如果在 `OS_UNIX` 定义的文件中定义了 `OPTION2`,那么 `unix_version_option2();` 这行代码会被编译和执行。这允许特定于Unix系统的不同选项可以根据需要启用或禁用。
```c
#elif defined(OS_MSDOS)
```
这行代码是 `#if` 的备用分支,用于检查 `OS_MSDOS` 是否被定义。如果当前编译的操作系统是 MS-DOS 或其他兼容系统,那么 `#elif` 块中的代码会被编译和执行。
```c
 #ifdef OPTION2
 msdos_version_option2();
 #endif
```
这段代码与之前解释的类似,但它是在 `OS_MSDOS` 定义的情况下使用的。它检查 `OPTION2` 是否被定义,如果在 `OS_MSDOS` 定义的文件中定义了 `OPTION2`,那么 `msdos_version_option2();` 这行代码会被编译和执行。这允许特定于MS-DOS系统的不同选项可以根据需要启用或禁用。
```c
#endif
```
这行代码标记了条件编译块的结束。
总结一下,这段代码允许根据当前编译的操作系统选择性地编译和执行特定的功能。如果操作系统是Unix,则执行与 `OPTION1` 和 `OPTION2` 相关的代码。如果操作系统是MS-DOS,则只执行与 `OPTION2` 相关的代码。如果操作系统既不是Unix也不是MS-DOS,那么整个代码块将被忽略。

———————————————————————————————————————————

#ifdef(定义了宏继续运行)+ #endif(结束)

#ifndef(没有定义宏则继续运行)+ #endif(结束)

在宏定义里面,我们有时候会定义的宏过多导致不知道宏是否已经定义了。所以我们可以·

- `#ifdef` 检查是否定义了某个宏,如果定义了,则编译后续的代码块。
- `#ifndef` 检查是否没有定义某个宏,如果没有定义,则编译后续的代码块。

下面是如何使用这些指令的例子:

```c
#ifdef MAX
// 如果 MAX 已经被定义,则编译这里的代码
printf("MAX is defined.\n");
#endif


#ifndef MAX
// 如果 MAX 没有被定义,则编译这里的代码
printf("MAX is not defined.\n");
#endif
```


在第一个 `#ifdef MAX` 指令之后,预处理器会检查 `MAX` 是否已经被定义。如果 `MAX` 已经被定义(比如通过 `#define MAX 10`),那么 `printf("MAX is defined.\n");` 这行代码会被编译和执行。如果 `MAX` 没有被定义,预处理器会忽略整个 `#ifdef` 和随后的 `#endif` 指令之间的代码块。
在第二个 `#ifndef MAX` 指令之后,预处理器会检查 `MAX` 是否没有被定义。如果 `MAX` 没有被定义,那么 `printf("MAX is not defined.\n");` 这行代码会被编译和执行。如果 `MAX` 已经被定义,预处理器会忽略整个 `#ifndef` 和随后的 `#endif` 指令之间的代码块。
这些指令通常用于条件编译外部头文件,或者在不同的编译环境中编译相同的代码,以避免重复包含和潜在的冲突。

#ifdef和#ifndef 总结

  • #ifdef 指令检查是否已经定义了某个宏。如果该宏已定义,则执行 #ifdef 和相应的 #endif 指令之间的代码。
  • #ifndef 指令检查是否没有定义某个宏。如果没有定义该宏,则执行 #ifndef 和相应的 #endif 指令之间的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决IDEA 控制台中文乱码

运行某个项目时IntelliJ IDEA 控制台中文乱码,但其他的项目是正常的。接口文档也显示乱码: 一、修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码 上方导航栏“File→Settings…”进入配置页面,在“Editor”中下滑找到“File Encodings…

Django检测到会话cookie中缺少HttpOnly属性手工复现

一、漏洞复现 会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本等)获取到用户的cookie信息,造成用户cookie信息泄露,增加攻击者的跨站脚本攻击威胁。 第一步:复制URL:http://192.168.43.219在浏览器打开,…

备战蓝桥杯Day37 - 真题 - 特殊日期

一、题目描述 思路: 1、统计2000年到2000000年的日期,肯定是需要遍历 2、闰年的2月是29天,非闰年的2月是28天。我们需要判断这一年是否是闰年。 1、3、5、7、8、10、12月是31天,4、6、9、11月是30天。 3、年份yy是月份mm的倍数…

【大数据】常见问题解决1

目录 一、解决虚拟机ping www.baidu.com 不通问题 二、解决HBase集群中的Hmaster节点刚启动就消息 三、 Hadoop3.x和Hadoop2.x的区别 一、解决虚拟机ping www.baidu.com 不通问题 1)首先保证主机连上网络 2)sudo vim /etc/resolv.conf 3)…

SpringBoot3整合RabbitMQ之三_工作队列模型案例

SpringBoot3整合RabbitMQ之三_工作队列模型案例 文章目录 SpringBoot3整合RabbitMQ之三_工作队列模型案例2. 工作队列模型1. 消息发布者1. 创建工作队列的配置类2. 发布消费Controller 2. 消息消费者One3. 消息消费者Two4. 消息消费者Three5. 输出结果 2. 工作队列模型 1. 消息…

【学习笔记】3、逻辑门电路

3.1 MOS逻辑门电路 按照器件结构的不同形式,分为NMOS、PMOS、CMOS三种逻辑门电路。 3.1.1 CMOS CMOS电路成为主导地位的逻辑器件。工作速度:赶上甚至超过TTL电路。(早期CMOS速度慢,后来工艺提升速度变快)功耗和抗干…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源: 命令合并: 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

系统架构评估_2.SAAM方法

SAAM(Scenarios-based Architecture Analysis Method)是卡耐基梅隆大学软件工程研究所(SEI at CMU)的Kazman等人于1983年提出的一种非功能质量属性的架构分析方法,是最早形成文档并得到广泛使用的软件架构分析方法。最…

SiteSpace 使用方法笔记

目录 介绍下载及安装准备工作知网 CNKI 文献分析数据准备数据转换新建项目图形处理 介绍 CiteSpace 是一个用于可视化和分析科学文献的工具。它可以从科学文献库中提取关键词、作者、机构和引用关系等信息,并将其可视化为图形网络。 一些使用案例 下载及安装 下载…

牛客论坛项目中使用到Redis的地方总结

实体分为很多类,实体的确定要通过实体类型和实体id两个属性同时确定。牛客论坛中使用到了3类实体: 1 登录 使用到的Redis命令: set key value // 设置指定key的值为value get key // 获取指定key的值1.1 存储/获取验证码 验证码文本&…

Django之静态文件及模板语法(上)

Python学习之路系列文章目录 python面向对象之警察与匪徒火拼场景模拟python面向对像之第二次笔记Django环境搭建及测试第1个Django应用及Django的请求处理Django之静态文件及模板语法(上) 静态文件及模板语法 Python学习之路系列文章目录一、静态文件1.…

xss基础

第一关&#xff1a; html部分标签可以解析js <script>alert (1)</script> 第二关&#xff1a; 可以看到value用双引号闭合了&#xff0c;使用上一关的payload没用&#xff0c;尝试一下闭合这个input 所以使用双引号和>闭合后再加入上一关的payload 11"…

【Redis 知识储备】垂直分库架构 -- 分布系统的演进(6)

垂直分库架构 简介出现原因架构工作原理技术案例架构优缺点 简介 数据库的数据被拆分, 数据库分布式存储, 分布式处理, 分布式查询, 也可以理解为分布式数据库框架 出现原因 单机的写库会逐渐会达到性能瓶颈, 需要拆分数据库, 数据表的数据量太大, 处理压力太大, 需要进行分…

python爬虫学习第十六天--------URLError和HTTPError、cookie登录、Handler处理器

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

性能分析-docker知识

docker的相关概念 docker是一个做系统虚拟化的软件&#xff0c;跟vmware类似&#xff0c;虚拟出来的也是操作系统。我们现在在企业中&#xff0c; 使用docker虚拟出来的系统&#xff0c;大多都是linux系统。 docker镜像image&#xff1a;就是虚拟一个docker容器需要的操作系统…

阿里云乱扣费故障,技术堪忧

2024年4月3日&#xff0c;距离2023年11月的故障没有多久&#xff0c;阿里云又出现乱扣费故障&#xff0c;导致账号欠费3000多&#xff0c;oss&#xff0c;块存储&#xff0c;cdn等所有后付费服务停止工作&#xff0c;不知道这个故障能算什么级别的。 凌晨1点多&#xff0c;收到…

Android 13 aosp 预置三方应用apk

前提条件 编译启动 launch 选择了 sdk_pc_x86_64-userdebug 该版本 添加一个三方预置应用 Android_source/vendor/third_party/MdmLib/MdmLib.apk 配置三方应用对应的Android.mk Android_source/vendor/third_party/MdmLib/Android.mk LOCAL_PATH : $(call my-dir)include $(CL…

【vue-qrcode + html2canvas】前端二维码生成与下载

一、前言 其实一开始搜的时候&#xff0c;很多还都是推荐的 vue-qrcode&#xff0c;于是就先用这个&#xff0c;但是发现想要在二维码中间放一个自定义的image的时候&#xff0c;这个库有点麻烦&#xff0c;需要自己将 image 图片盖在二维码上面&#xff08;官方教程也是如此&…

使用pytorch构建有监督的条件GAN(conditional GAN)网络模型

本文为此系列的第四篇conditional GAN&#xff0c;上一篇为WGAN-GP。文中在无监督的基础上重点讲解作为有监督对比无监督的差异&#xff0c;若有不懂的无监督知识点可以看本系列第一篇。 原理 有条件与无条件 如图投进硬币随机得到一个乒乓球的例子可以看成是一个无监督的GAN&…

SDWAN专线保护企业数据传输安全

企业数字化进程的加速和网络环境的复杂化&#xff0c;数据传输安全已经成为企业网络管理的头等大事。SD-WAN&#xff08;软件定义广域网&#xff09;作为一种新兴的网络技术&#xff0c;不仅能够提升网络性能和效率&#xff0c;还能够有效地保护企业数据传输的安全性。以下是SD…