【C语言】预编译
🚩write in front🚩
🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星TOP100~2022博客之星TOP63~周榜159 ⌁ 总榜751~阿里云专家博主 & 阿里云星级博主~掘金优秀创作者⇿InfoQ创作者⇿51CTO红人⇿全网访问量50w+🏅
🆔本文由 謓泽 原创 CSDN首发🙉 如需转载还请通知⚠
📝个人主页-謓泽的博客_CSDN博客 📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏-【C】系列_謓泽的博客-CSDN博客🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩
目录
🚩write in front🚩
🔥预定义符号🔥
🔮日志🔮
🔥条件编译🔥
🔥常见条件编译指令🔥
🙌三大要点

🔥预定义符号🔥
预定义符号一共有⑤种,如下所示↓
- __FILE__:表示进行编译的文件名。
- __LINE__:表示文件当前的行号。
- __DATE__:表示文件被编译的日期。
- __TIME__:表示文件被编译的时间。
- __STDC__:如果编译器遵循的是ANSIC,其中值为1,不然就是未定义。
- __FUNCTION__:表示该函数所在的函数名。
那么我们用上面的代 码打印来分别看看它们的最终打印出的结果吧,代码示例如下↓
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(void) {printf("%s\n", __FILE__);printf("%d\n", __LINE__);printf("%s\n", __DATE__);printf("%s\n", __TIME__);printf("%s\n", __FUNCTION__);//在vs上不支持STDCprintf("%d\n",__STDC__)return 0; }运行结果🖊
main.c
6
Mar 15 2022
07:38:23
main
1拓展知识点
#error: 可以进行自定义编译器报错. #line: 可以定制化你的文件名以及代码行号(__FILE__&__LINE__) #pragma:用于指定计算机或操作系统特定的编译器功能(#pragma message ("str"))不会报错条件是否存在. #pragma warning(disable:num):消除警告.🔮日志🔮
那么接下来我们就来用 fopen() 函数来写下"日志"打开文件为 log.txt,在做这个之前我们先复习下原来的知识点如下↓
- FILE:对象,其中包含用于控制流的信息。
- fopen():打开一个文件。
- fprintf():格式化输出函数。
- fclose():关闭文件。
- 在下面代码 mode 参数访问使用了"a+":append/update(读写):打开一个文件进行更新(包括输入和输出),所有输出操作都在文件的末尾写入数据。重新定位操作(fseek, fsetpos、rewind)影响下一个输入操作,但输出操作将位置移回文件末尾。如果文件不存在,则创建该文件。
代码示例如下💤
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(void) {FILE* pf = fopen("log.txt", "a+");if (pf == NULL){perror("fopen");return 1;}fprintf(pf, "%s %d %s %s %s\n", __FILE__, __LINE__, __DATE__, __TIME__, __FUNCTION__);//关闭文件fclose(pf);pf = NULL;return 0; }
说明-O-从上述的结果当中可以看出,成功打印出了"日志"信息。
🔥条件编译🔥
条件编译一句话:满足条件就编译,不满足条件就不编译。
在编译一个程序的时候,我们如果将一条语句或者是一组的语句编译再或者是放弃是非常的方便的。因为我们有条件编译的指令。比如↓
调试行的代码,删除可惜,保留又碍事,所以我们可以选择性的编译。
举出下面的例子代码如下↓
在这里会举出两个例子①参与编译、②不参与编译。在这里我们先举出第②个例子↓
#include<stdio.h>int main(void) { #ifdef PRINTprintf("hello C"); #endif }运行结果如下↓
无,那么这个是为什么呢。实际上就是我们用了条件编译语句。把它给屏蔽了也就是不参与编译了。
#ifdef PRINT// #endif那么我们想让上面代码参与编译我们该怎么办呢。实际上很简单+#define 即可。
#include<stdio.h> #define PRINT int main(void) { #ifdef PRINTprintf("hello C"); #endif }运行结果🖊
hello C
🔥常见条件编译指令🔥
#if指令
- 该指令检测表达式值是否为真。如果表达式的值为真,则编译后面的代码直到出现 #else、#elif 或 #endif 为止,否则不编译。
#endif指令
- 该指令用于终止 #if 指令。
#else指令
- 该指令用于 #if 指令之后,当前面的 #if 指令的条件不为真时,就编译 #else 后面的代码。
//如果宏定义了PRINT执行,否则执行#else #ifdef PRINT printf("HELLO"); #elseprintf("C"); #endif#elif指令
- 该指令综合了 #else 和 #if 指令的作用。下面的示例代码演示了 #if、#else、#elif 与 #endif 的组合使用情况。其实和else if()语句作用差不多都是配合#if来进行使用的多条件语句当中使用。
#ifdef 和 #ifndef 指令
- 相对于 #if 指令(检测表达式的值是否为真),#ifdef 和 #ifndef 指令用于检测指令关键字后面的宏名称是否已经定义。其中,#ifdef 指令表示如果宏已经被定义,那么它的检测结果为真,否则返回假;而 #ifndef 指令的含义正好与 #ifdef 指令相反,它表示如果宏未被定义,那么它的检测结果为真,否则为假。
🙌三大要点
⒈为何要有条件编译?
本质是为了进行对应的达到裁剪代码的目的,而我们裁剪代码的目的通常很丰富具体是和你的应用场景有关系的。有的是为了进行一个版本之间的维护的,例如:有商业版和免费版等...当然我们还有可能使用条件编译完成其它的事情。
⒉条件编译如何使用?
在上述条件编译讲解当中我们也说过的,这里就不在描述了。大家可以自己上手用代码描述一下。
⒊条件编译在哪些地方使用?
通常用于中大型项目当中会使用到条件编译以及版本之间的维护(某某软件完全版和精简版)当然条件编译还可以完成一些其它的事情。
★结论⇢条件编译的本质是对代码进行裁剪。
相关文章:
【C语言】预编译
🚩write in front🚩 🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5࿵…...
音频信号处理笔记(一)
相关课程:【音频信号处理及深度学习教程】 文章目录01 信号的时域分析1.1 分帧1.1.1 幅值包络1.1.2 均方根能量0 信号的叠加:https://teropa.info/harmonics-explorer/ 一个复杂信号分解成若干简单信号分量之和。不同个频率信号的叠加: 由于和差化积&a…...
【深度学习】模型评估
上一章——多分类问题和多标签分类问题 文章目录算法诊断模型评估交叉验证测试算法诊断 如果你为问题拟合了一个假设函数,我们应当如何判断假设函数是否适当拟合了?我们可以通过观察代价函数的图像,当代价函数达到最低点的时候,此…...
AcWing《蓝桥杯集训·每日一题》—— 3777 砖块
AcWing《蓝桥杯集训每日一题》—— 3777. 砖块 文章目录AcWing《蓝桥杯集训每日一题》—— 3777. 砖块一、题目二、解题思路三、解题思路本次博客我是通过Notion软件写的,转md文件可能不太美观,大家可以去我的博客中查看:北天的 BLOG…...
CleanMyMac X软件下载及详细功能介绍
mac平台的知名系统清理应用CleanMyMac在经历了一段时间的测试后,全新设计的X正式上线。与CleanMyMac3相比,新版本的UI设计焕然一新,采用了完全不同的风格。使用Windows电脑时,很多人会下载各类优化软件,而在Mac平台中&…...
pytorch零基础实现语义分割项目(一)——数据概况及预处理
语义分割之数据加载项目列表前言数据集概况数据组织形式数据集划分数据预处理均值与方差结尾项目列表 语义分割项目(一)——数据概况及预处理 语义分割项目(二)——标签转换与数据加载 语义分割项目(三)…...
ARM+LINUX嵌入式学习路线
嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 1、嵌入式linux上层应用,包括QT的GUI开发 2、嵌入式linux系统开发 3、…...
echart在微信小程序的使用
echart在微信小程序的使用 echarts不显示在微信小程序 <!-- 微信小程序的echart的使用 --> <view class"container"><ec-canvas id"mychart-dom-bar" canvas-id"mychart-bar" ec"{{ ec }}"></ec-canvas> &l…...
51单片机最强模块化封装(5)
文章目录 前言一、创建timer文件,添加timer文件路径二、timer文件编写三、模块化测试总结前言 今天这篇文章将为大家封装定时器模块,定时器是工程项目中必不可少的,希望大家能够将定时器理解清楚并且运用自如。 一、创建timer文件,添加timer文件路径 这里的操作就不过多…...
链表学习之判断链表是否回文
链表解题技巧 额外的数据结构(哈希表);快慢指针;虚拟头节点; 判断链表是否回文 要求:时间辅助度O(N),空间复杂度O(1) 方法1:栈(不考虑空间复杂度) 遍历一…...
【Linux06-基础IO】4.5万字的基础IO讲解
前言 本期分享基础IO的知识,主要有: 复习C语言文件操作文件相关的系统调用文件描述符fd理解Linux下一切皆文件缓冲区文件系统软硬链接动静态库的理解和制作动静态编译 博主水平有限,不足之处望请斧正! C语言文件操作 #再谈文件…...
c++协程库理解—ucontext组件实践
文章目录1.干货写在前面2.ucontext初接触3.ucontext组件到底是什么4.小试牛刀-使用ucontext组件实现线程切换5.使用ucontext实现自己的线程库6.最后一步-使用我们自己的协程库1.干货写在前面 协程是一种用户态的轻量级线程 首先我们可以看看有哪些语言已经具备协程语义&#x…...
英语基础-状语
1. 课前引语 1. 形容词使用场景 (1). 放在系动词后面作表语 The boy is handsome. (2). 放在名词前面做定语 I like this beautiful girl. (3). 放在宾语后面做补语 You make your father happy. 总结:形容词无论做什么,都离不开名词,…...
目标检测笔记(八):自适应缩放技术Letterbox完整代码和结果展示
文章目录自适应缩放技术Letterbox介绍自适应缩放技术Letterbox流程自适应缩放Letterbox代码运行结果自适应缩放技术Letterbox介绍 由于数据集中存在多种不同和长宽比的样本图,传统的图片缩放方法按照固定尺寸来进行缩放会造成图片扭曲变形的问题。自适应缩放技术通…...
2023年全国最新高校辅导员精选真题及答案1
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、选择题 11.李某与方某签订房屋租赁合同期间,李某欲购买租赁房屋ÿ…...
【Python】Python读写Excel表格
简要版,更多功能参考资料1。1 Excel文件保存格式基础概念此处不提,详见资料1。Excel的文件保存格式有两种: xls 和 xlsx。如果你看不到文件后缀,按下图设置可见。xls是Office 2003及之前版本的表格的默认保存格式。xlsx 是 Excel …...
Python每日一练(20230218)
目录 1. 旋转图像 2. 解码方法 3. 二叉树最大路径和 1. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像…...
基于SSM框架的狼途汽车门店管理系统的设计与实现
基于SSM框架的狼途汽车门店管理系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、…...
视频监控流程图3
<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"/> <link rel"stylesheet" type"text/css" href"visio.css"/> <title> 视频监控流程图 </title> <…...
Linux ARM平台开发系列讲解(CAN) 2.14.3 CANFD协议介绍
1. 概述 前面章节介绍了CAN2.0协议,CAN现在主要是用在汽车领域,随着CAN的发展, 又衍生除了CANFD协议,该协议是在CAN的基础之上进行了升级,CAN2.0的最高速率是1Mbps,有限的速率导致CAN总线上负载率变高,所以CANFD就出现了,CANFD目前最高支持10Mbps。除此之外,CANFD还拥…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
