当前位置: 首页 > 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 指令相反,它表示如果宏未被定义,那么它的检测结果为真,否则为假。

🙌三大要点

⒈为何要有条件编译?

本质是为了进行对应的达到裁剪代码的目的,而我们裁剪代码的目的通常很丰富具体是和你的应用场景有关系的。有的是为了进行一个版本之间的维护的,例如:有商业版和免费版等...当然我们还有可能使用条件编译完成其它的事情。

⒉条件编译如何使用?

在上述条件编译讲解当中我们也说过的,这里就不在描述了。大家可以自己上手用代码描述一下。

⒊条件编译在哪些地方使用?

通常用于中大型项目当中会使用到条件编译以及版本之间的维护(某某软件完全版和精简版)当然条件编译还可以完成一些其它的事情。

★结论⇢条件编译的本质是对代码进行裁剪。

http://www.lryc.cn/news/11510.html

相关文章:

  • 音频信号处理笔记(一)
  • 【深度学习】模型评估
  • AcWing《蓝桥杯集训·每日一题》—— 3777 砖块
  • CleanMyMac X软件下载及详细功能介绍
  • pytorch零基础实现语义分割项目(一)——数据概况及预处理
  • ARM+LINUX嵌入式学习路线
  • echart在微信小程序的使用
  • 51单片机最强模块化封装(5)
  • 链表学习之判断链表是否回文
  • 【Linux06-基础IO】4.5万字的基础IO讲解
  • c++协程库理解—ucontext组件实践
  • 英语基础-状语
  • 目标检测笔记(八):自适应缩放技术Letterbox完整代码和结果展示
  • 2023年全国最新高校辅导员精选真题及答案1
  • 【Python】Python读写Excel表格
  • Python每日一练(20230218)
  • 基于SSM框架的狼途汽车门店管理系统的设计与实现
  • 视频监控流程图3
  • Linux ARM平台开发系列讲解(CAN) 2.14.3 CANFD协议介绍
  • 参考 | 给C盘 “搬家“
  • 剑指 Offer 53 - II. 0~n-1中缺失的数字
  • 分布式id
  • 创意编程py模拟题
  • uniapp中条件编译
  • 封装 YoloV5 detect.py 成 Python 库以供 python 程序使用
  • PostgreSQL , PostGIS , 球坐标 , 平面坐标 , 球面距离 , 平面距离
  • K3S 系列文章-5G IoT 网关设备 POD 访问报错 DNS ‘i/o timeout‘分析与解决
  • 社会工程学介绍
  • 干货 | 有哪些安慰剂按钮的设计?
  • LeetCode 每日一题 2023/2/13-2023/2/19