25-无值宏与条件编译

25-无值宏与条件编译

宏是一种用于替换代码段的预处理指令。在编译阶段之前,预处理器会用宏的定义替换代码中的宏调用。条件编译则是一种根据条件来决定是否编译某些代码的技术。

文章目录

  • 25-无值宏与条件编译
    • 一、无值宏
    • 二、条件编译
      • **形式1:使用无值宏**
      • **形式2:使用有值宏**
      • 条件编译的实际应用

一、无值宏

在定义宏的时候不需要给定某一个值,对于无值来说只是用来做一个简单的判断(是否有定义)

示例:

#define DE_BUG

通过这个定义,你可以在代码中使用DE_BUG来检查其是否定义。

二、条件编译

条件编译根据宏定义的情况决定某些代码块是否参与编译

形式1:使用无值宏

使用#ifdef#ifndef判断是否定义了某个宏。

示例:

#ifdef DE_BUG  // 如果定义了DE_BUG宏printf("Debugging: %s %d\n", __FILE__, __LINE__);
#endif#ifndef DE_BUG  // 如果没有定义DE_BUG宏printf("Not debugging: %s %d\n", __FILE__, __LINE__);
#endif

#ifdef判断某个宏是否定义,#ifndef判断某个宏是否未定义。

形式2:使用有值宏

使用#if判断宏的值是否为非零。

示例:

#define MACRO 1  // 非零为真#if MACROprintf("MACRO is non-zero: %s %d\n", __FILE__, __LINE__);
#endif#if MACROprintf("MACRO is non-zero: %s %d\n", __FILE__, __LINE__);
#elseprintf("MACRO is zero: %s %d\n", __FILE__, __LINE__);
#endif#if MACRO1printf("MACRO1 is non-zero: %s %d\n", __FILE__, __LINE__);
#elif MACRO2printf("MACRO2 is non-zero: %s %d\n", __FILE__, __LINE__);
#elseprintf("Neither MACRO1 nor MACRO2 is non-zero: %s %d\n", __FILE__, __LINE__);
#endif

在使用有值宏进行条件编译时,宏的值只能是整型或字符,不能是字符串。

条件编译的实际应用

可以通过修改代码中的宏定义,或者在编译命令中添加宏定义来控制条件编译。

通过代码修改宏定义:

#define DE_BUG

通过编译命令定义宏:

    gcc ifdef.c -DDE_BUG

这里的-DDE_BUG相当于在代码中添加#define DE_BUG

示例代码

以下是一个完整示例,演示如何使用条件编译:

#include <stdio.h>// 定义无值宏
#define DE_BUG// 定义有值宏
#define MACRO 1int main() {
#ifdef DE_BUGprintf("Debugging enabled: %s %d\n", __FILE__, __LINE__);
#endif#ifndef DE_BUGprintf("Debugging disabled: %s %d\n", __FILE__, __LINE__);
#endif#if MACROprintf("MACRO is non-zero: %s %d\n", __FILE__, __LINE__);
#elseprintf("MACRO is zero: %s %d\n", __FILE__, __LINE__);
#endif#if MACRO1printf("MACRO1 is non-zero: %s %d\n", __FILE__, __LINE__);
#elif MACRO2printf("MACRO2 is non-zero: %s %d\n", __FILE__, __LINE__);
#elseprintf("Neither MACRO1 nor MACRO2 is non-zero: %s %d\n", __FILE__, __LINE__);
#endifreturn 0;
}

通过这种方式,可以根据实际需要灵活地启用或禁用特定的代码段,有助于调试、测试以及在不同配置下编译代码。

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

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

相关文章

Conda修改包/虚拟环境储存目录

Conda修改包/虚拟环境储存目录 关键字样例 关键字 通过conda config --show [key]可以查看某个配置的值&#xff0c;[key]留空可以查看所有配置 其中&#xff1a; envs-dirs 存放虚拟环境的储存目录pkgs_dirs 包的目录 通过conda config --add [key] [value]可以为配置添加值…

Tomcat部署、优化、压力测试

目录 Tomcat概念 核心组件 Web容器 Web服务器之间解析请求的区别 Apache HTTP Server Nginx Tomcat Servlet容器 JSP容器 字节码文件 Tomcat表面处理请求的过程 Tomcat底层处理请求的过程 内部结构 Tomcat部署 JRE环境配置 PATH冒号位置的区别 安装Tomcat 目…

《峡谷小狐仙-多模态角色扮演游戏助手》复现流程

YongXie66/Honor-of-Kings_RolePlay: The Role Playing Project of Honor-of-Kings Based on LnternLM2。峡谷小狐仙--王者荣耀领域的角色扮演聊天机器人&#xff0c;结合多模态技术将英雄妲己的形象带入大模型中。 (github.com) https://github.com/chg0901/Honor_of_Kings…

[Leetcode 203][Easy]移除链表元素

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先分成两种情况。第一种情况要先判断头元素是否要删除。第二种要在第一种基础上进行&#xff08;删除到头元素不是要删除的元素&#xff09;&#xff0c;然后遍历链表&#xff0c;遍历到不是…

大语言模型-GPT2-Generative Pre-Training2

一、背景信息&#xff1a; GPT2是2019年由OpenAI 提出的预训练语言模型。 GPT2提出语言模型式无监督的多任务学习 。旨在通过无监督学习也能达到和finetune一样的效果&#xff0c;并且拥有更强的泛化能能力。 即提出利用语言模型做下游任务时&#xff0c;不需要下游任务的任何…

美食地图开发

调用地图接口展示数据库录入的不同类别地址信息&#xff0c;提供导航服务&#xff0c;手机端电脑端自适应。 语音介绍使用微软的tts接口可选不同语音性别生成

2.2 openCv 如何使用 OpenCV 进行图像扫描、查找表操作及时间测量

目标 我们将寻找以下问题的答案: 如何遍历图像中的每一个像素?OpenCV中的矩阵值是如何存储的?如何度量我们算法的性能?我们的测试案例 让我们考虑一个简单的色彩缩减方法。由于使用无符号字符类型(C 和 C++)来存储矩阵中的项目,像素的一个通道可能有多达 256 种不同的值。…

在linux中,如何搭建nacos2.4.0的版本,修改nacos密码

由于最近服务器经常被攻击&#xff0c;看了一下发现是nacos版本过低&#xff0c;导致被抓了肉鸡&#xff0c;导致服务器的网端被跑满&#xff0c;选择重新搭建nacos&#xff0c;进入服务器后&#xff0c;首先确定服务器是否安装java&#xff0c;先执行java -version&#xff0c…

Hadoop、Hive、HBase、数据集成、Scala阶段测试

姓名&#xff1a; 总分&#xff1a;Hadoop、Hive、HBase、数据集成、Scala阶段测试 一、选择题&#xff08;共20道&#xff0c;每道0.5分&#xff09; 1、下面哪个程序负责HDFS数据存储&#xff08; C &#xff09; A. NameNode B. Jobtracher C. DataNode D. Sec…

vue3引入openlayers

安装ol包 OpenLayers作为 ol npm包提供&#xff0c;它提供了官方支持的API的所有模块。 官方地址&#xff1a;ol npm install ol模块和子模块约定 具有CamelCase名称的OpenLayers模块提供类作为默认导出&#xff0c;并且可能包含其他常量或函数作为命名导出&#xff1a; i…

Thinkphp5跨域问题常见的处理方法

在ThinkPHP5中&#xff0c;处理跨域问题通常涉及配置中间件或直接在控制器中设置响应头。以下是几种常见的解决跨域问题的方法&#xff1a; 1. 使用中间件处理跨域 你可以创建一个中间件来专门处理跨域请求。这个中间件会检查请求的来源&#xff0c;并设置相应的响应头来允许…

requests中的http连接

文章目录 前言一、安装 requests二、发送 HTTP 请求三、响应对象完整代码 前言 最近的学习内容中涉及到服务端和客户端的数据传输。主要的背景是我要从服务端获取数据&#xff0c;进行进一步的处理。前期看了一些关于Socket中TCP连接的方法&#xff0c;同样也可以进行通信。但…

vim gcc

vim 使用 vs filename 分屏 ctrl ww 切窗口 shift zz 快速提出vim vim配置 vim启动时自动读取当前用户的家目录的.vimrc文件 vim配置只影响本用户 其他用户观看同一文件不受影响 gcc指令 & c文件编译过程 动态库 静态库 & 链接方式 有相应库才能进行…

学习笔记13:怎么申请https 证书

怎么申请https 证书 申请 HTTPS 证书&#xff08;也称为 SSL/TLS 证书&#xff09;是一个涉及多个步骤的过程&#xff0c;主要目的是为网站提供安全加密和身份验证。以下是申请 HTTPS 证书的一般步骤&#xff1a; 1. 选择证书颁发机构&#xff08;CA&#xff09; 首先&#…

mysql优化面试题

目录 一、EXPLAIN 慢查询定位分析 二、SQL 语句优化 三、索引优化 四、分库分表 五、主从复制 六、缓存优化 一、EXPLAIN 慢查询定位分析 EXPLAIN 是 MySQL 提供的一个分析工具&#xff0c;用于了解查询的执行计划。通过解析 EXPLAIN 结果&#xff0c;可以识别性能瓶颈。…

全面解析 SnowNLP:中文文本处理、情感分析

1 前言 SnowNLP 是一个专门用于处理中文文本的 Python库。功能包括&#xff1a; 分词情感分析关键词提取文本分类拼音转换繁体转简体词相似度计算等 snownlp0.12.3测试环境&#xff1a;Python3.10.9 2 分词 中文分词&#xff08;Character-Based Generative Model&#xf…

Docker 镜像 pull 失败(Docker 镜像停止服务解决方法)

解决办法——切换镜像&#xff1a; 1、https://mirror.baidubce.com2、https://docker.nju.edu.cn 配置好之后&#xff0c;通过 docker info命令查看是否配置成功。 在 Registry Mirrors 下找到这两个地址&#xff0c;如果存在了&#xff0c;表示配置成功。 Registry Mirrors…

目标检测进阶:1.COCO数据集与VOC数据集

目录 一、COCO数据集 1.COCO数据集下载 2.COCO数据集相关介绍 Captions.json文件 instances.json文件 Person_keypoints.json文件 3.提取instances中的边界框信息 二、VOC数据集 1.VOC数据集下载 VOC2007训练集验证集百度云资源&#xff08;提取码6zg6&#xff09;htt…

【docker】Ubuntu20安装docker并拉取mongodb

文章目录 docker安装拉取mongodb其他操作配置mongodb远程连接 docker安装 // 安装 apt install docker.io // 换源 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF{"registry-mirrors": ["https://ox288s4f.mirror.aliyuncs.com&q…

获取STM32 MCU的唯一ID

获取STM32 MCU的唯一ID 这里以STM32F103为例&#xff0c;简单运用了一下 #include "stm32f10x.h"/*开辟一个数组来装96bit的ID号*/ u32 id[3] {0xFFFFFFFF};/*获取STM32 MCU的唯一ID*/ void GetSTM32MCUID(uint32_t *id) {if(id!NULL){id[0]*(uint32_t*)(0x1FFFF7E8…