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

C语言之宏定义

目录

前言

一、宏定义前操作

二、引用自定义.h文件

三、宏定义#define 

四、对比typedef的差异

五、替换一个函数或表达式

六、嵌套宏替换

七、用宏和typedef创建一个“布尔型数据

八、定义有参数的宏

总结


前言

        C语言中的宏定义是一种预处理指令,用来定义常量、函数宏、条件编译等。宏定义使得代码更具有可读性和可维护性,同时也提高了代码的灵活性和可重用性。

        在C语言中,宏定义通常使用#define指令来创建。通过宏定义,我们可以在程序中使用符号常量来代替特定的数值或字符串,这样可以使代码更易于阅读和理解。另外,宏定义还可以用于定义函数宏,即将一段代码片段封装成一个宏,以便在程序中多次调用,减少代码的重复性。


一、宏定义前操作

清理->重新生成

 

若注释掉头文件,宏.i只有下面的情况

 

二、引用自定义.h文件

相当于复制粘贴

 #pragma once:仅包含一次,否则以下代码将在.i文件中出现多次

#include"a.h"
#include"b.h"
#include"a.h"
#include"b.h"
#include"a.h"
#include"b.h"

 

三、宏定义#define 

替换的作用

//#include <stdio.h>
#include"a.h"
#include"b.h"/*C 语言启动的经历:1:预处理期: 在这一阶段,源码中的所有预处理语句得到处理例如:#include语句所包含的文件内容替换掉语句本身,所有已定义的宏被展开。2:编译期:编译器对源码进行词法分析、语法分析、优化等操作,最后生成汇编代码。3:汇编期:生成机器语言代码,保存在后缀为.o的目标文件中4:链接期:经过汇编以后的机器代码还不能直接运行。为了使操作系统能够正确加载可执行文件,文件中必须包含固定格式的信息头,还必须与系统提供的启动代码链接起来才能正常运行,这些工作都是由链接器来完成的。5:执行期:执行.EXE文件,得到运行结果*/
//#define :宏·宏替换
//增强阅读
//宏·常量
#define SUCCESS 0
#define LEN 1000int main()
{/*宏替换简称宏的格式:#define 宏替换名称  替换内容*/int a[LEN], b[LEN], c[LEN];return 0;
}

 

四、对比typedef的差异

五、替换一个函数或表达式

	//1定义宏
#define PT printf("hello world");//2使用宏PT PT

六、嵌套宏替换

不用循环的1000个helloworld

#define A PT PT PT PT PT PT PT PT PT PT
#define B A A A A A A A A A A
#define C B B B B B B B B B B
C

七、用宏和typedef创建一个“布尔型数据

#define TRUE 1
#define FALSE 0
typedef int boolean;
boolean gu_shi = TRUE;

八、定义有参数的宏

	//宏·“函数”
#define ARR_LEN(array_name) (sizeof(array_name) / sizeof(array_name[0]))
#define ARR_LEN2(arr_name,arr_type) (sizeof(arr_name) / sizeof(arr_type))
int aa[] = { 4,3,6,9,8,5,2,4 };
int len1 = ARR_LEN(aa);
int len2 = ARR_LEN2(aa,int);double bb[] = { 1.1,2.7,3.14,9.8 };
int len3 = ARR_LEN(bb);
int len4 = ARR_LEN2(bb, double);

 


总结

        总的来说,宏定义在C语言中扮演着至关重要的角色,可以使代码更加灵活、可读性更强,并且提高了代码的可维护性。

相关文章:

C语言之宏定义

目录 前言 一、宏定义前操作 二、引用自定义.h文件 三、宏定义#define 四、对比typedef的差异 五、替换一个函数或表达式 六、嵌套宏替换 七、用宏和typedef创建一个“布尔型数据 八、定义有参数的宏 总结 前言 C语言中的宏定义是一种预处理指令&#xff0c;用来定义常量、函数…...

大语言模型基础

简介 AI大模型是“人工智能预训练大模型”的简称,包含了“预训练”和“大模型”两层含义,二者结合产生了一种新的人工智能模式,即模型在大规模数据集上完成了预训练后无需微调,或仅需要少量数据的微调,就能直接支撑各类应用。AI大模型主要分为三类:大语言模型、CV大模型…...

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体&#xff0c;当输入的值为负数时&#xff0c;会自动显示红色字体&#xff0c;对于数值或者金额输入时该功能就非常有用了。 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.co…...

Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解

Web 自动化测试提速利器&#xff1a;Aqua 的 Web Inspector &#xff08;检查器&#xff09;使用详解 前言简介一、安装二、Web Inspector 的使用2.1 获取元素定位器&#xff08;Locators&#xff09;2.2 将定位器添加到代码2.3 验证定位器2.4 处理 Frames (框架) 总结 前言 Je…...

23种设计模式 - 空对象模式

模式定义 空对象模式&#xff08;Null Object Pattern&#xff09;是一种行为型设计模式&#xff0c;通过用无操作的空对象替代null值&#xff0c;消除客户端对空值的检查&#xff0c;避免空指针异常。其核心是让空对象与真实对象实现相同接口&#xff0c;但空对象不执行实际逻…...

【mysql80 安装】mysql8.0.31 安装修改3306端口

在离线安装 MySQL 时&#xff0c;可以通过修改 MySQL 的配置文件来更改默认的 3306 端口。以下是具体步骤&#xff1a; 1、vim /etc/my.cnf 打开配置文件后&#xff0c;找到 [mysqld] 部分&#xff0c;这是 MySQL 服务的配置区域。在该部分中&#xff0c;找到或添加以下内容&a…...

基于eBPF的全栈可观测性系统:重新定义云原生环境诊断范式

引言&#xff1a;突破传统APM的性能桎梏 某头部电商平台采用eBPF重构可观测体系后&#xff0c;生产环境指标采集性能提升327倍&#xff1a;百万QPS场景下传统代理模式CPU占用达63%&#xff0c;而eBPF直采方案仅消耗0.9%内核资源。核心业务的全链路追踪时延从900μs降至18μs&a…...

C语言基础学习指南:从零入门到实战应用——适合零基础学习者与进阶巩固

目录 一、C语言概述与开发环境搭建 二、核心语法与数据类型 三、控制结构与运算符 四、函数与模块化编程 五、指针与内存管理 六、实践建议与资源推荐 结语 一、C语言概述与开发环境搭建 C语言是一种高效、灵活的通用编程语言&#xff0c;广泛应用于系统开发、嵌入式系…...

软件架构设计:架构风格

一、架构风格概述 定义 架构风格是对软件系统整体结构和组织方式的抽象描述&#xff0c;提供了一套通用的设计原则和模式。 作用 提高系统的可维护性、可扩展性和可复用性。帮助开发团队在设计和实现过程中保持一致性和规范性。 常见架构风格 分层架构、MVC架构、微服务架构、…...

为啥vue3设计不直接用toRefs,而是reactive+toRefs

Vue 3 设计中将 reactive 和 toRefs 结合使用而非直接使用 toRefs&#xff0c;主要基于以下设计考量&#xff1a; 1. 响应式粒度的不同需求 reactive 适用于对象整体响应式 reactive 会为整个对象创建响应式代理&#xff0c;自动追踪对象内部所有属性的变化。这种设计适用于需要…...

go 网络编程 websocket gorilla/websocket

在 Go 语言中&#xff0c;你可以使用标准库中的 net/http 包和第三方库 gorilla/websocket 来实现一个 WebSocket 服务器。gorilla/websocket 库提供了对 WebSocket 协议的高级抽象&#xff0c;使得处理 WebSocket 连接变得相对简单。 package mainimport ("fmt"&qu…...

【微服务】springboot远程docker进行debug调试使用详解

目录 一、前言 二、线上问题常用解决方案 2.1 微服务线上运行中常见的问题 2.2 微服务线上问题解决方案 2.3 远程debug概述 2.3.1 远程debug原理 2.3.2 远程debug优势 三、实验环境准备 3.1 搭建springboot工程 3.1.1 工程结构 3.1.2 引入基础依赖 3.1.3 添加配置文…...

CORS跨域问题常见解决办法

1.引言 在现代前端开发中&#xff0c;跨域资源共享&#xff08;Cross-Origin Resource Sharing, CORS&#xff09;是一种通过设置 HTTP 头来允许或阻止不同源之间的资源访问的机制。浏览器出于安全考虑&#xff0c;默认情况下会阻止跨域请求。本文将详细介绍 CORS 的工作原理、…...

并查集算法篇上期:并查集原理及实现

引入 那么我们在介绍我们并查集的原理之前&#xff0c;我们先来看一下并查集所应用的一个场景&#xff1a;那么现在我们有一个长度为n的数组&#xff0c;他们分别属于不同的集合&#xff0c;那么现在我们要查询数组当中某个元素和其他元素是否处于同一集合当中&#xff0c;或者…...

树莓派4基于Debian GNU/Linux 12 (Bookworm)添加多个静态ipv4网络

假设之前已经配置了 在eth0接口配置了192.168.0.100&#xff0c;现在要在同一接口&#xff08;例如 eth0&#xff09;上添加 192.168.1.100&#xff1a; 直接编辑 /etc/NetworkManager/system-connections/ 中相应的连接文件&#xff08;该文件的文件名通常与连接名称相同&…...

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件

PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件&#xff0c;以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性&#xff0c;如颜色、字体大小、样式和粗细。…...

Python连接MySQL数据库图文教程,Python连接数据库MySQL入门教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 环境准备1.1安装 Python1.2选择开发环境1.3安装 MySQL 数据库1.4 安装 pymysql 库 2. 连接数据库3. 数据库基本操作3.1 创建数据库3.2 创建表3.3 插入数据3.…...

Websocket——心跳检测

1. 前言&#xff1a;为什么需要心跳机制&#xff1f; 在现代的实时网络应用中&#xff0c;保持客户端和服务端的连接稳定性是非常重要的。尤其是在长时间的网络连接中&#xff0c;存在一些异常情况&#xff0c;导致服务端无法及时感知到客户端的断开&#xff0c;可能造成不必要…...

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言&#xff1a;金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时&#xff0c;其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中&#xff0c;量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…...

文心智能体平台已全面接入DeepSeek模型,全部免费!

文心智能体平台已全面接入DeepSeek模型&#xff01;即日起&#xff0c;您可以在创建智能体时&#xff0c;自由选择所需要的模型&#xff0c;欢迎大家体验。 ✅ ‌零成本体验‌&#xff1a;当前阶段所有用户可免费使用‌DeepSeek模型。‌ ✅ ‌‌智能适配&#xff1a;4款DeepSe…...

DuodooBMS源码解读之 odoo_phoenix_alarm模块

Odoo18 扩展模块声光报警器用户使用手册 一、模块概述 本扩展模块是基于 Odoo18 原生系统进行开发的&#xff0c;主要用于实现与上位声光报警设备的通讯功能。通过该模块&#xff0c;用户可以方便地向设备发送指令&#xff0c;控制设备的声音、灯光等操作。本手册将详细介绍该…...

docker从容器中cp到本地、cp本地到容器

在 Docker 中&#xff0c;你可以使用 docker cp 命令从容器中复制文件到本地主机。以下是具体步骤&#xff1a; 1. 查找容器 ID 或名称 首先&#xff0c;你需要知道容器的 ID 或名称。你可以使用以下命令列出所有正在运行的容器&#xff1a; docker ps 这将显示所有正在运行…...

网络工程师 (49)UDP协议

前言 UDP协议&#xff0c;即用户数据报协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;是一种无连接的、不可靠的、面向报文的传输层通信协议。 一、基本特点 无连接性&#xff1a;UDP在发送数据之前不需要与目标设备建立连接&#xff0c;也无需在数据发送结束…...

1.20作业

1 mfw(git泄露) ./git&#xff0c;原本以为点了链接下了index文件&#xff0c;就可以打开看源码&#xff0c;结果解析不了 老老实实用了githacker githacker --url --output 1 assert() 断言(assert)的用法 | 菜鸟教程 命令注入: /?page).system(cat ./templates/fl…...

HTML/CSS中交集选择器

1.作用:选中同时符合多个条件的元素 交集就是或的意思 2.语法:选择器1选择器2选择器3......选择器n{} 3.举例: /* 选中:类名为beauty的p元素,此种写法用的非常的多 */p.beauty{color: red;}/* 选中:类名包含rich和beauty的元素 */.rich.beauty{color: blue;} 4.注意: 1.有标签…...

迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-修改HCS配置

对于不同的平台&#xff0c;需要在对应的平台目录修改对应的 hcs 文件&#xff0c;接下来示例为在 rk3568下新增 uart4 uart9 uart7 的修改方法。 修改 vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs 文件&#xff0c;device_info.hcs 中添加以下内容&…...

实时股票行情接口与WebSocket行情接口的应用

实时股票行情接口与WebSocket行情接口的应用 实时股票行情接口是量化交易和投资决策的核心工具之一&#xff0c;行情接口的种类和功能也在不断扩展。介绍几种常见的行情接口&#xff0c;包括实时股票行情接口、Level2行情接口、WebSocket行情接口以及量化行情接口&#xff0c;…...

k8s故障处理经典案例(Classic Case of k8s Fault Handling)

k8s故障处理经典案例 问题描述 kubernetes版本&#xff1a;v1.22.5 部分Pod在新版本发布后一直处于ContainerCreating状态&#xff0c;经过kubectl delete命令删除后一直Terminating状态。 排查过程 遇到问题先查日志 首先进入宿主机&#xff0c;查看三个日志&#xff0c…...

关于uniApp的面试题及其答案解析

我的血液里流淌着战意&#xff01;力量与智慧指引着我&#xff01; 文章目录 1. 什么是uniApp&#xff1f;2. uniApp与原生小程序开发有什么区别&#xff1f;3. 如何使用uniApp实现条件编译&#xff1f;4. uniApp支持哪些平台&#xff0c;各有什么特点&#xff1f;5. 在uniApp中…...

给老系统做个安全检查——Burp SqlMap扫描注入漏洞

背景 在AI技术突飞猛进的今天&#xff0c;类似Cursor之类的工具已经能写出堪比大部分程序员水平的代码了。然而&#xff0c;在我们的代码世界里&#xff0c;仍然有不少"老骥伏枥"的系统在兢兢业业地发光发热。这些祖传系统的代码可能早已过时&#xff0c;架构可能岌…...

langchain系列 - FewShotPromptTemplate 少量示例

导读 环境&#xff1a;OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3 背景&#xff1a;前期忙碌的开发阶段结束&#xff0c;需要沉淀自己的应用知识&#xff0c;过一遍LangChain 时间&#xff1a;20250220 说明&#xff1a;技术梳理&#xff0c;针对FewShotP…...

【C语言】fgetpos函数用法介绍

目录 一、函数概述 二、核心参数与数据类型 三、典型应用场景 四、与 ftell() 的对比 五、错误处理与调试 六、进阶示例&#xff1a;多位置标记与恢复 七、注意事项 八、总结 fgetpos() 是C标准库中用于文件操作的关键函数之一&#xff0c;其核心功能是获取文件流的当前…...

《算法基础入门:最常用的算法详解与应用(持续更新实战与面试题)》

1. 排序算法 排序算法是将一组数据按特定的顺序排列起来的算法&#xff0c;常见的有&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;选择排序&#xff08;Selection Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;归并排序&#xff08;Merge So…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-split_dota.py

split_dota.py ultralytics\data\split_dota.py 目录 split_dota.py 1.所需的库和模块 2.def bbox_iof(polygon1, bbox2, eps1e-6): 3.def load_yolo_dota(data_root, split"train"): 4.def get_windows(im_size, crop_sizes(1024,), gaps(200,), im_rate_t…...

如何使用Python快速开发一个带管理系统界面的网站-解析方案

如果你想用 Python 开发一个 管理系统界面 的网站&#xff0c;并且希望界面美观&#xff0c;可以考虑以下几个框架和库&#xff1a; 1. Streamlit&#xff08;快速、简洁&#xff09; 适合&#xff1a;数据分析、仪表盘、内部管理系统特点&#xff1a; 写法简单&#xff0c;类…...

25年HVV关于0day的面试题

以下是对0day漏洞如何防&#xff0c;基本上是每次HVV中大家都会提到的&#xff0c;今天总结了100day防护手段。 《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkw…...

【C# 数据结构】队列 FIFO

目录 队列的概念FIFO (First-In, First-Out)Queue<T> 的工作原理&#xff1a;示例&#xff1a;解释&#xff1a; 小结&#xff1a; 环形队列1. **FIFO&#xff1f;**2. **环形缓冲队列如何实现FIFO&#xff1f;**关键概念&#xff1a; 3. **环形缓冲队列的工作过程**假设…...

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…...

【机器学习】多元线性回归算法和正规方程解求解

多元线性方差和正规方差解 一、摘要二、多元线性回归介绍三、正规方程解的求解及代码实现 一、摘要 本文围绕多元线性回归的正规方程解展开&#xff0c;为初学者系统介绍了相关基本概念、求解方法、实际应用以及算法封装要点。 首先&#xff0c;深入阐释了正规方程解这一多元…...

在Linux上创建一个Docker容器并在其中执行Python脚本

在Linux上创建一个Docker容器并在其中执行Python脚本的过程&#xff0c;涉及多个方面的内容&#xff0c;包括安装Docker、编写Dockerfile、构建镜像、运行容器等。 1. 安装Docker 在Linux上使用Docker之前&#xff0c;你需要确保系统已安装Docker。Docker支持的Linux发行版有…...

Linux C 静态库如何生成并使用

1. 编写源文件 首先创建一个简单的示例项目&#xff0c;包含一个头文件和一个源文件。 头文件 my_lib.h // my_lib.h #ifndef MY_LIB_H #define MY_LIB_H// 函数声明 int add(int a, int b);#endif 源文件 my_lib.c #include <stdio.h>void print_hello() {printf(&q…...

清华大学deepseek教程第四版 DeepSeek+DeepResearch 让科研像聊天一样简单(附下载)

deepseek使用教程系列 DeepSeekDeepResearch 让科研像聊天一样简单(附下载) https://pan.baidu.com/s/1VMgRmCSEzNvhLZQc8mu6iQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/f3d4511b790a...

请解释 Vue 中的生命周期钩子,不同阶段触发的钩子函数及其用途是什么?

vue生命周期钩子详解&#xff08;Vue 3版本&#xff09; 一、生命周期阶段划分 Vue组件的生命周期可分为四大阶段&#xff0c;每个阶段对应特定钩子函数&#xff1a; 创建阶段&#xff1a;初始化实例并准备数据挂载阶段&#xff1a;将虚拟DOM渲染为真实DOM更新阶段&#xff…...

输入搜索、分组展示选项、下拉选取,el-select 实现:即输入关键字检索,返回分组选项,选取跳转到相应内容页 —— VUE 项目-全局模糊检索

后端数据代码写于下一篇&#xff1a;输入搜索、分组展示选项、下拉选取&#xff0c;全局跳转页&#xff0c;el-select 实现 —— 后端数据处理代码&#xff0c;抛砖引玉展思路 【效果图】&#xff1a;分组展示选项 【去界面操作感受一下】—> 便捷简洁的企业官网 【录制效…...

Transformer为什么需要多头注意力(Multi-Head Attention)?如果没有多头会怎么样?

直接回答 关键点&#xff1a; Transformer 中的多头注意力&#xff08;Multi-Head Attention&#xff09;允许模型同时关注输入数据的不同方面&#xff0c;提升性能。 如果没有多头&#xff0c;模型可能无法捕捉复杂关系&#xff0c;表现会下降。 什么是多头注意力&#xff…...

VUE中的组件加载方式

加载方式有哪些&#xff0c;及如何进行选择 常规的静态引入是在组件初始化时就加载所有依赖的组件&#xff0c;而懒加载则是等到组件需要被渲染的时候才加载。 对于大型应用&#xff0c;可能会有很多组件&#xff0c;如果一开始都加载&#xff0c;可能会影响首屏加载时间。如…...

Linux自启动fastapi服务

步骤一 在/etc/systemd/system/文件夹下创建pyod.service&#xff08;其中/path/to/conda/bin/activate要改为activate实际存放位置&#xff0c;例如miniconda的实际存放位置为/root/miniconda3/bin/activate&#xff09; [Unit] DescriptionPyOD Uvicorn Service Afternetwo…...

C++与Python:两种编程语言的区别

C和Python都是当今编程领域广泛使用的语言&#xff0c;它们各有特色&#xff0c;适用于不同的开发场景。本文将从语言特性、性能、学习难度、应用领域等多个方面探讨C与Python之间的区别。 一、语言特性 类型系统&#xff1a; C&#xff1a;是一种静态类型语言&#xf…...

进程线程的创建、退出、回收

1. 进程相关知识点 1.1 进程创建 fork()&#xff1a; 功能&#xff1a;创建一个子进程。 返回值&#xff1a; 父进程中返回子进程的 PID。 子进程中返回 0。 失败返回 -1。 特点&#xff1a;子进程是父进程的副本&#xff0c;拥有独立的内存空间。 vfork()&#xff1a;…...

深度学习-6.用于计算机视觉的深度学习

Deep Learning - Lecture 6 Deep Learning for Computer Vision 简介深度学习在计算机视觉领域的发展时间线 语义分割语义分割系统的类型上采样层语义分割的 SegNet 架构软件中的SegNet 架构数据标注 目标检测与识别目标检测与识别问题两阶段和一阶段目标检测与识别两阶段检测器…...