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

【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语言】预编译

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…...

音频信号处理笔记(一)

相关课程&#xff1a;【音频信号处理及深度学习教程】 文章目录01 信号的时域分析1.1 分帧1.1.1 幅值包络1.1.2 均方根能量0 信号的叠加&#xff1a;https://teropa.info/harmonics-explorer/ 一个复杂信号分解成若干简单信号分量之和。不同个频率信号的叠加: 由于和差化积&a…...

【深度学习】模型评估

上一章——多分类问题和多标签分类问题 文章目录算法诊断模型评估交叉验证测试算法诊断 如果你为问题拟合了一个假设函数&#xff0c;我们应当如何判断假设函数是否适当拟合了&#xff1f;我们可以通过观察代价函数的图像&#xff0c;当代价函数达到最低点的时候&#xff0c;此…...

AcWing《蓝桥杯集训·每日一题》—— 3777 砖块

AcWing《蓝桥杯集训每日一题》—— 3777. 砖块 文章目录AcWing《蓝桥杯集训每日一题》—— 3777. 砖块一、题目二、解题思路三、解题思路本次博客我是通过Notion软件写的&#xff0c;转md文件可能不太美观&#xff0c;大家可以去我的博客中查看&#xff1a;北天的 BLOG&#xf…...

CleanMyMac X软件下载及详细功能介绍

mac平台的知名系统清理应用CleanMyMac在经历了一段时间的测试后&#xff0c;全新设计的X正式上线。与CleanMyMac3相比&#xff0c;新版本的UI设计焕然一新&#xff0c;采用了完全不同的风格。使用Windows电脑时&#xff0c;很多人会下载各类优化软件&#xff0c;而在Mac平台中&…...

pytorch零基础实现语义分割项目(一)——数据概况及预处理

语义分割之数据加载项目列表前言数据集概况数据组织形式数据集划分数据预处理均值与方差结尾项目列表 语义分割项目&#xff08;一&#xff09;——数据概况及预处理 语义分割项目&#xff08;二&#xff09;——标签转换与数据加载 语义分割项目&#xff08;三&#xff09…...

ARM+LINUX嵌入式学习路线

嵌入式学习是一个循序渐进的过程&#xff0c;如果是希望向嵌入式软件方向发展的话&#xff0c;目前最常见的是嵌入式Linux方向&#xff0c;关注这个方向&#xff0c;大概分3个阶段&#xff1a; 1、嵌入式linux上层应用&#xff0c;包括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文件路径 这里的操作就不过多…...

链表学习之判断链表是否回文

链表解题技巧 额外的数据结构&#xff08;哈希表&#xff09;&#xff1b;快慢指针&#xff1b;虚拟头节点&#xff1b; 判断链表是否回文 要求&#xff1a;时间辅助度O(N)&#xff0c;空间复杂度O(1) 方法1&#xff1a;栈&#xff08;不考虑空间复杂度&#xff09; 遍历一…...

【Linux06-基础IO】4.5万字的基础IO讲解

前言 本期分享基础IO的知识&#xff0c;主要有&#xff1a; 复习C语言文件操作文件相关的系统调用文件描述符fd理解Linux下一切皆文件缓冲区文件系统软硬链接动静态库的理解和制作动静态编译 博主水平有限&#xff0c;不足之处望请斧正&#xff01; 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. 总结&#xff1a;形容词无论做什么&#xff0c;都离不开名词&#xff0c…...

目标检测笔记(八):自适应缩放技术Letterbox完整代码和结果展示

文章目录自适应缩放技术Letterbox介绍自适应缩放技术Letterbox流程自适应缩放Letterbox代码运行结果自适应缩放技术Letterbox介绍 由于数据集中存在多种不同和长宽比的样本图&#xff0c;传统的图片缩放方法按照固定尺寸来进行缩放会造成图片扭曲变形的问题。自适应缩放技术通…...

2023年全国最新高校辅导员精选真题及答案1

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、选择题 11.李某与方某签订房屋租赁合同期间&#xff0c;李某欲购买租赁房屋&#xff…...

【Python】Python读写Excel表格

简要版&#xff0c;更多功能参考资料1。1 Excel文件保存格式基础概念此处不提&#xff0c;详见资料1。Excel的文件保存格式有两种&#xff1a; xls 和 xlsx。如果你看不到文件后缀&#xff0c;按下图设置可见。xls是Office 2003及之前版本的表格的默认保存格式。xlsx 是 Excel …...

Python每日一练(20230218)

目录​​​​​​​ 1. 旋转图像 2. 解码方法 3. 二叉树最大路径和 1. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像…...

基于SSM框架的狼途汽车门店管理系统的设计与实现

基于SSM框架的狼途汽车门店管理系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、…...

视频监控流程图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+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...