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

入门-C编程基础部分:16、 预处理器

飞书文档https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf

C 预处理是编译过程中一个单独的步骤,是一个文本替换工具而已。所有的预处理命令都是以井号(#)开头。

指令描述
#define定义宏
#ifdef如果宏已经定义,则返回真
#ifndef如果宏没有定义,则返回真
#endif结束一个 #if……#else 条件编译块

#define

#define MAX_ARRAY_LENGTH 20

这个指令告诉编译器把所有的 MAX_ARRAY_LENGTH 定义为 20。使用 #define 定义常量来增强可读性。

#include <stdio.h>
#define MESSAGE "You wish!"
#define MAX_ARRAY_LENGTH 20
int main(void)
{printf("Here is the message: %s\n", MESSAGE);printf("max array length : %d\n", MAX_ARRAY_LENGTH );  return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Here is the message: You wish!
max array length : 20

#define更多用法

宏定义函数

C语言一个强大的功能是可以使用参数化的宏来模拟函数。例如,

int square(int x) {return x * x;
}
我们可以使用宏重写上面的代码,如下:
#define square(x) ((x) * (x))

在使用带有参数的宏之前,必须使用 #define 指令定义。参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。例如:

#include <stdio.h>#define square(x) ((x) * (x))int main(void)
{printf("10*10=%d\n", square(10)); return 0;
}

宏延续运算符(\

一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用宏延续运算符(\)。例如:

#define square(x) \((x) * (x))

标记粘贴运算符(##

宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。例如:

#include <stdio.h>#define tokenpaster(n) printf ("token = %d", token##n)int main(void)
{int token34 = 40;tokenpaster(34);return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

token = 40

#ifndef

#ifndef TEST#define MESSAGE "You wish!"
#endif

这个指令告诉编译器只有当 MESSAGE 未定义时,才定义 MESSAGE,常用于头文件,防止重复引用

C
test.h
int a = 10;
app1.c
#include "test.h"
app2.c
#include "test.h"

编译时会报multiple definition of `a'错误,这时候可以添加

#ifndef TEST
  
int a = 10;
#endif

#ifdef

#ifdef DEBUG
  
/* Your debugging statements here */
#endif

这个指令告诉 CPP 如果定义了 DEBUG,则执行处理语句,常用于编译选择,例如下发工程,如果我们只希望在调试时打印信息,正式发布不打印信息。

#include <stdio.h>#define DEBUG
#ifdef DEBUG#define MESSAGE "You wish!"
#endifint main(void)
{#ifdef DEBUGprintf("Here is the message: %s\n", MESSAGE);#endifreturn 0;
}

相关文章:

入门-C编程基础部分:16、 预处理器

飞书文档https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf C 预处理是编译过程中一个单独的步骤&#xff0c;是一个文本替换工具而已。所有的预处理命令都是以井号&#xff08;#&#xff09;开头。 指令描述#define定义宏#ifdef如果宏已经定义&#xff0c;则返…...

Spark-SQL4

一 .Spark-SQL核心编程&#xff08;六&#xff09; Spark-SQL连接Hive Apache Hive 是 Hadoop 上的 SQL 引擎&#xff0c;Spark SQL 编译时可以包含 Hive 支持&#xff0c;也可以不包含。包含 Hive 支持的 Spark SQL 可以支持 Hive 表访问、UDF (用户自定义函数)、Hive 查询语…...

模数转换【1】AD7699

1.开发背景 一款可以模数转换芯片&#xff0c;兼容通用 SPI 接口&#xff0c;支持最多支持 8 个通道和 500KSPS 的采样率。支持单个通道采集和扫描采集模式。 同系列的芯片还有 AD7682 和 AD7689 等。 2.开发需求 配置内部参考电压4.096V&#xff0c;实现单个通道采集和扫描采集…...

P5670 秘籍-反复异或 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​) 和常数 m m m&#xff0c;有 q q q 个操作分两种&#xff1a; add ⁡ ( l , r , x ) \operatorname{add}(l,r,x) add(l,r,x)&#xff1a;对每个 i ∈ [ l , r ] i\in[l,r] …...

PID控制程序编写

目录 一、C语言PID控制器示例代码 二、代码解释 三、重要注意事项 一、C语言PID控制器示例代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> // For sleep function typedef struct { double Kp; // 比例增益 double…...

推荐系统/业务,相关知识/概念2

一、漫画库更新大量新作品&#xff0c;如何融入推荐系统&#xff1f; 参考答案&#xff1a; 快速提取新作品特征&#xff1a;除基础属性外&#xff0c;利用自然语言处理技术提取漫画简介关键词等丰富特征向量&#xff0c;分析情节、角色设定等深层次特征结合物品画像体系分类…...

基于Python的施工图与竣工图对比小工具开发方案

基于Python的施工图与竣工图对比小工具开发方案 一、引言 在工程建设领域&#xff0c;施工图与竣工图的对比是项目验收的关键环节。传统人工对比方式效率低、易出错&#xff0c;本文基于Python开发一款自动化对比工具&#xff0c;支持快速检测图纸差异并生成可视化报告&#x…...

2025年世界职业院校技能大赛实施方案(意见稿)

为贯彻落实《教育强国建设规划纲要&#xff08;2024—2035年&#xff09;》&#xff0c;进一步提升世界职业院校技能大赛&#xff08;以下简称“大赛”&#xff09;内涵质量&#xff0c;发挥大赛引领作用&#xff0c;提升高技能人才培养质量&#xff0c;服务现代职业教育体系建…...

辛格迪客户案例 | 苏州富士莱医药GMP培训管理(TMS)项目

一、案例概述 富士莱医药股份有限公司位于美丽的江南水乡常熟&#xff0c;前身为常熟富士莱医药化工有限公司&#xff0c;从建厂初期面积仅有10余亩&#xff0c;逐步扩展到100余亩。近年来公司飞速发展&#xff0c;以黑马姿态发展成为中国专业生产硫辛酸系列产品、肌肽系列产品…...

安恒安全渗透面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...

【基于WSAAsyncSelec模型的通信程序设计】

文章目录 一、实验背景与目的二、实验设计与实现思路1. 设计思想2. 核心代码实现 总结 一、实验背景与目的 这次实验主要是为了让大家了解基于 WSAAsyncSelect 模型通信程序的编写、编译和执行过程。通过实践操作&#xff0c;深入掌握这种模型在实现计算机之间通信时的应用。 …...

Spring Boot+Mybatis设置sql日志打印

Spring BootMybatis设置sql日志打印 在全局配置文件添加以下内容&#xff1a;logging.level.com.demo.mapperdebug&#xff0c;com.demo.mapper&#xff1a;src下的mapper路径&#xff0c;debug&#xff1a;设置日志打印级别为debug&#xff0c;亦可设置为&#xff1a;ERROR、…...

Java 性能优化:从硬件到软件的全方位思考

Java 性能优化&#xff1a;从硬件到软件的全方位思考 在数字化飞速发展的当下&#xff0c;Java 作为广泛使用的编程语言&#xff0c;在各个应用领域发挥着关键作用。而 Java 性能优化作为提升系统运行效率、降低成本的核心环节&#xff0c;需要我们从硬件到软件进行全方位深入…...

ros2 humble moveit调试笔记

Overview — ROS2 Grasp Library Tutorials 0.5.0 documentation Robot Interface — ROS2 Grasp Library Tutorials 0.5.0 documentation 手动添加ompl_planning.yaml文件 planning_plugins:- ompl_interface/OMPLPlanner # To optionally use Ruckig for jerk-limited s…...

静态点亮数码管的某几段(STC89C52单片机)

#include <reg52.h> sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4; void main() { ENLED 0; //使能U3&#xff0c;选择数码管DS1 ADDR3 1; ADDR2 0; ADDR1 0; ADDR0 0; P0 0xF9; /…...

搭建哨兵架构

Redis大纲 3.1.sentinel环境准备&#xff1a; a.3个sentinel实例信息&#xff1a; 1.sentinel实例信息如下&#xff0c;sentinel只是起到监控作用&#xff0c;不存放数据&#xff01;&#xff01;2.为了节省资源&#xff0c;在同一台虚拟机开启3个实例&#xff0c;必须准备三…...

阿里云入门手册

阿里云入门手册 一、付费方式二、云计算基础概念&#xff08;一&#xff09;云计算定义&#xff08;二&#xff09;云计算优势&#xff08;三&#xff09;云计算部署模式&#xff08;四&#xff09;专有网络 VPC 三、阿里云ECS实例&#xff08;一&#xff09;实例类型&#xff…...

AI日报 - 2024年04月22日

&#x1f31f; 今日概览(60秒速览) ▎&#x1f916; 模型进展 | Google发布Gemini 2.5 Flash&#xff0c;强调低延迟与成本效益&#xff1b;Kling AI 2.0展示多轴运动视频生成&#xff1b;研究揭示SLM在知识图谱上优于LLM&#xff0c;RLHF在推理提升上存局限。 ▎&#x1f4bc;…...

Windows BilibiliHistoryFetcher-v1.3.2-v1.2.1-开源B站历史记录管理工具[支持批量管理下载]

Windows BilibiliHistoryFetcher 链接&#xff1a;https://pan.xunlei.com/s/VOONAVJpANYPmzu1Zc3B0q1XA1?pwdnrjc# 使用说明&#xff1a; 以1.3.2与1.2.1版本为例 需要下载 BiliBili-History-Frontend 前端程序&#xff0c;在下载 BilibiliHistoryAnalyzer 解压运行&#…...

CH585单片机的LCD外设怎么驱动段式LCD

1、首先这里只讲应用&#xff0c;不讲具体原理。 要驱动段式LCD&#xff0c;这里就要知道占空比的调整&#xff0c;比如1/4为例就需要4个COM口。这4个COM口由单片机自行驱动&#xff0c;你不用管。就像硬件IIC和SPI&#xff0c;时序问题不用你去操心&#xff0c;你要做的就是向…...

包管理工具有哪些?主流软件分享

常见的包管理工具主要有&#xff1a;npm、Yarn、pnpm、Composer、Maven、pip、Conda 等&#xff0c;其中 npm 是目前全球使用最广泛的JavaScript包管理工具&#xff0c;以丰富的生态、便捷的使用体验以及强大的社区支持闻名。npm具备依赖管理、版本控制、脚本执行等强大功能&am…...

【网络安全】OWASP 十大漏洞

1. OWASP 十大漏洞 为了应对未来的风险&#xff0c;安全专业人员需要随时掌握最新信息。之前&#xff0c;您了解了CVE 列表&#xff0c;这是一个公开的已知漏洞和暴露列表。CVE 列表是全球安全社区相互共享信息的重要信息来源。 在本文中&#xff0c;您将了解安全专业人士参考…...

Fortran中FORALL的用法与性能分析

Fortran中FORALL的用法与性能分析 FORALL语句的基本用法 FORALL是Fortran 95引入的一种结构&#xff0c;用于表达并行数组操作。它的基本语法如下&#xff1a; FORALL (index start:end:stride, mask)array(index) expression END FORALL或者更复杂的多维度形式&#xff1…...

web组件和http协议

1.web组件 2.自定义元素 3.影子DOM 4.HTML模板 5.http协议 6.tcp ip协议...

论文笔记-arXiv2025-FilterLLM

论文笔记-arXiv2025-FilterLLM: Text-To-Distribution LLM for Billion-Scale Cold-Start Recommendation FilterLLM&#xff1a;面向十亿级冷启动推荐的文本到分布大语言模型摘要1.引言2.前言2.1符号说明2.2文本到判断2.2.1候选生成&#xff08;从数十亿到数百&#xff09;2.2…...

Anaconda Prompt 切换工作路径的方法

直接切换是不生效的&#xff1a; (base) C:\Users\96975>cd D:\weiban-tool-master\weiban-tool-master需要先回到根目录C盘&#xff0c;然后切换到目标文件夹盘符&#xff0c;进一步切换到目标文件夹 (base) C:\Users\96975>cd ..(base) C:\Users>cd ..(base) C:\&g…...

Synopsys:printvar命令和puts/echo命令的区别

相关阅读 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12812219.html?spm1001.2014.3001.5482 Synopsys的EDA工具中存在一类变量&#xff0c;它们能控制工具的行为&#xff0c;被称为应用变量(application variable)&#xff0c;与之对应的是用户自定义变量(use…...

自注意力机制、多头自注意力机制、填充掩码 Python实现

原理讲解 【Transformer系列&#xff08;2&#xff09;】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解 自注意力机制 import torch import torch.nn as nn# 自注意力机制 class SelfAttention(nn.Module):def __init__(self, input…...

Cursor可视化大屏搭建__0420

主题:用Cursor怎么进行数据洞察,做AI预测化内容。 Python基础语法与AI python生态强大,代码简洁,相对其他语言Python更好上手,浙江高考将Python列为可选科目 科学计算:Sklearn,Numpy,Pandas 人工智能:Tensorflow,Pytorch 网络爬虫:Scrapy…...

postman乘法计算,变量赋值

postman脚本怎么计算乘法 在Postman中&#xff0c;你可以通过多种方式计算乘法&#xff0c;这取决于你的具体需求。例如&#xff0c;如果你想在发送请求前计算乘法结果&#xff0c;或者在测试标签中计算响应数据的乘法&#xff0c;下面是一些常见的方法。 1. 使用JavaScript代…...

计算机视觉——利用AI幻觉检测图像是否是生成式算生成的图像

概述 俄罗斯的新研究提出了一种非常规方法&#xff0c;用于检测不真实的AI生成图像——不是通过提高大型视觉-语言模型&#xff08;LVLMs&#xff09;的准确性&#xff0c;而是故意利用它们的幻觉倾向。 这种新方法使用LVLMs提取图像的多个“原子事实”&#xff0c;然后应用自…...

前端配置代理解决发送cookie问题

场景&#xff1a; 在开发任务管理系统时&#xff0c;我遇到了一个典型的身份认证问题&#xff1a;​​用户登录成功后&#xff0c;调获取当前用户信息接口却提示"用户未登录"​​。系统核心流程如下&#xff1a; ​​用户登录​​&#xff1a;调用 /login 接口&…...

word显示段落标记符(¶)而不是回车符

现象 公司的一位同事找到我说word显示异常&#xff0c;出现了段落标记符&#xff08;&#xff09;。 反馈的截图如下&#xff1a; 正常的截图如下&#xff1a; 原因 语言设置错误 解决 文件 选项 更改语言 关闭word并重启 恢复正常...

使用 Vue Router 和 Vite 构建的自动路由生成系统

这段代码是一个使用 Vue Router 和 Vite 构建的自动路由生成系统。它的主要作用是自动扫描 views 目录下的所有 Vue 组件文件,并为它们创建相应的路由配置,无需手动为每个页面定义路由。 主要功能和工作流程 项目说明 结构 . ├── App.vue ├── assets │ └── v…...

乐家桌面安卓版2025下载-乐家桌面软件纯净版安装分享码大全

是否在为智能电视或机顶盒上的应用资源不够丰富而烦恼&#xff1f;在使用安卓版乐家桌面或者纯净版乐家桌面的过程中还需要通过搜索框多页面查询&#xff0c;小编今天为大家来介绍一款好用的电视桌面——乐看家桌面&#xff0c;将为你打开一个全新的软件世界&#xff01; 乐看家…...

【sylar-webserver】重构日志系统

文章目录 主要工作流程图FiberConditionBufferBufferManagerLogEvent 序列化 & 反序列化LoggerRotatingFileLogAppender 主要工作 实现&#xff0c; LogEvent 序列化和反序列化 &#xff08;使用序列化是为了更标准&#xff0c;如果转成最终的日志格式再存储&#xff08;确…...

图形编辑器基于Paper.js教程27:对图像描摹的功能实现,以及参数调整

本篇文章来讲一下 图像描摹的功能的实现。 我们知道要雕刻图片可以通过分析图片的像素来生成相应的gcode进行雕刻&#xff0c;但如果你想要将图片转换为线稿进行雕刻&#xff0c;这个时候就要从图片中提取出 线稿。 例如下面的图片&#xff1a; 你想要获取到这个图片的线稿&…...

使用Mybaitis-plus提供的各种的免写SQL的Wrapper的使用方式

文章目录 内连接JoinWrappers.lambda和 new MPJLambdaWrapper 生成的MPJLambdaWrapper对象有啥区别&#xff1f;LambdaQueryWrapper 和 QueryWrapper的区别&#xff1f;LambdaQueryWrapper和MPJLambdaQueryWrapper的区别&#xff1f;在作单表更新时建议使用&#xff1a;LambdaU…...

SQL_连续登陆问题

文章目录 方案1&#xff1a;使用ROW_NUMBER函数1、针对对数据user_id分组&#xff0c;根据用户的活动日期排序2、用登录日期与rn求date_sub&#xff0c;得到的差值日期如果是相等的&#xff0c;则说明这两天肯定是连续的3、根据user_id和日期差sub_date分组&#xff0c;登录次数…...

【解决】Vue + Vite + TS 配置路径别名成功仍爆红

目录 前言 一.vite.config.ts 二.tsconfig.json 三. 别名配置成功&#xff0c;但语法提示爆红问题 四、可能遇到的问题 前言 ‌在项目中设置路径别名后仍然出现爆红问题&#xff0c;通常是由于配置不完整或配置错误导致的。Vite 中配置 alias 总共需要配置两个地方: vite…...

Discuz!与DeepSeek结合:打造智能论坛,提升用户体验与运营效率

引言 随着互联网技术的飞速发展&#xff0c;社区论坛作为用户交流、分享信息的重要平台&#xff0c;其用户体验和运营效率成为了影响平台竞争力的关键因素。Discuz!作为国内领先的社区论坛软件系统&#xff0c;以其强大的功能和广泛的用户基础&#xff0c;在社区论坛领域占据着…...

Federated Feature Augmentation and Alignment

TPAMI2025,说是解决特征偏移问题,但从实验看其他数据异构也一并改善了。文章和题目一样干了特征增强和特征对齐两件事。特征增强部分套了两次高斯拟合,搞得很复杂,没法一句话说清楚。特征对齐部分是截断成直方图,然后双向KL散度。 论文:目前好像只有ieee能搜到 代码:只…...

ThinkPHP5 的 SQL 注入漏洞

ThinkPHP5 的 SQL 注入漏洞&#xff08;常被安全社区称为 ThinkPHP5 SQL5 注入漏洞&#xff09;是 ThinkPHP5 框架中一系列因设计缺陷导致的安全问题&#xff0c;主要影响早期版本。 一、漏洞背景 ThinkPHP5 的 SQL 注入漏洞主要源于框架对用户输入数据的处理不当&#xff0c;尤…...

Linux学习笔记|入门指令

man 指令 用法&#xff1a;man [指令名称] &#xff0c;用于查看指定指令的帮助手册&#xff0c;获取指令的详细语法、选项及使用示例等信息 。示例&#xff1a;想了解 ls 指令的用法&#xff0c;执行 man ls &#xff0c;会进入 man 手册页面展示 ls 相关信息。按 q 键可退出。…...

前端实现数据导出成excel

前端(react/vue)实现数据导出成excel 1. 下载依赖 npm install js-export-excel -D 2. 新建exportExcel.js import ExportJsonExcel from js-export-excel; ​ /*** Event: 获取导出数据* description:* param config.tableParams<Object>: 表格接口请求参数* param …...

海事局发布《船舶智能监控系统技术指南(1.0)》,解读智驱力产品为何成为最佳选择!

为深入推进人工智能、边缘计算等新技术在水上交通安全领域应用&#xff0c;强化船舶安全风险实时感知、智能预警&#xff0c;推动水上交通安全治理模式向事前预防转型&#xff0c;中华人民共和国海事局于2025年3月11日正式制定了《船舶智能监控系统技术指南&#xff08;1.0&…...

uCOS3实时操作系统(系统初始化和任务启动)

文章目录 ucos初始化任务创建任务启动 ucos初始化 系统运行的过程如下&#xff1a;OSInit -> OSTaskCreate -> OSStartucos初始化主要在 OSInit 中进行&#xff0c;下面列举了该初始化过程中比较重要的几个步骤&#xff1a;OSInit()OSInitHook();OS_CPU_ExceptStkBase /…...

线上地图导航小程序源码介绍

基于ThinkPHP、FastAdmin和UniApp三大前沿技术推出的一款线上地图导航小程序源码&#xff0c;ThinkPHP作为后端框架&#xff0c;以其轻量、高效和灵活的特点&#xff0c;确保了小程序的稳定性和可扩展性。FastAdmin则是基于ThinkPHP构建的管理后台&#xff0c;操作简便、功能全…...

Mininet--nodelib.py源码解析

整体构架概述 1. What is it&#xff1f; 本代码是 Mininet 网络仿真框架的扩展模块&#xff0c;包含 LinuxBridge 和 NAT 两类节点。LinuxBridge 提供基于 Linux 网桥的交换机功能&#xff0c;支持生成树协议&#xff08;STP&#xff09;&#xff0c;用于构建冗余网络拓扑并防…...

[C++]多重继承:构造函数调用顺序解析

在C中&#xff0c;当派生类通过 多重继承 &#xff08;Multiple Inheritance&#xff09;继承多个基类&#xff08;如 A、B、C&#xff09;时&#xff0c;其构造函数调用顺序遵循以下规则&#xff1a; 1. 基类构造顺序 基类的构造函数调用顺序严格按照派生类定义中的基类声明…...