前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【C语言】预编译

【C语言】预编译

作者头像
謓泽
发布2023-02-22 19:54:24
发布2023-02-22 19:54:24
87800
代码可运行
举报
文章被收录于专栏:【C】系列【C】系列
运行总次数:0
代码可运行

🚩write in front🚩    🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星TOP100~2022博客之星TOP63~周榜159 ⌁ 总榜751~ 🆔本文由 謓泽 原创 CSDN首发🙉 如需转载还请通知⚠ 📝个人主页-謓泽的博客_CSDN博客 📃 📣系列专栏-【C】系列_謓泽的博客-CSDN博客🎓 ✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

目录

🚩write in front🚩   

🔥预定义符号🔥 

🔮日志🔮

🔥条件编译🔥 

🔥常见条件编译指令🔥

🙌三大要点

🔥预定义符号🔥

预定义符号一共有⑤种,如下所示↓

  • __FILE__:表示进行编译的文件名。
  • __LINE__:表示文件当前的行号。
  • __DATE__:表示文件被编译的日期。
  • __TIME__:表示文件被编译的时间。
  • __STDC__:如果编译器遵循的是ANSIC,其中值为1,不然就是未定义。
  • __FUNCTION__:表示该函数所在的函数名。

那么我们用上面的代 码打印来分别看看它们的最终打印出的结果吧,代码示例如下↓ 

代码语言:javascript
代码运行次数:0
复制
#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上不支持STDC
    printf("%d\n",__STDC__)
	return 0;
}

运行结果🖊

main.c 6 Mar 15 2022 07:38:23 main 1

拓展知识点

代码语言:javascript
代码运行次数:0
复制
#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)影响下一个输入操作,但输出操作将位置移回文件末尾。如果文件不存在,则创建该文件。

代码示例如下💤

代码语言:javascript
代码运行次数:0
复制
#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-从上述的结果当中可以看出,成功打印出了"日志"信息。 

🔥条件编译🔥

条件编译一句话:满足条件就编译,不满足条件就不编译。

在编译一个程序的时候,我们如果将一条语句或者是一组的语句编译再或者是放弃是非常的方便的。因为我们有条件编译的指令。比如↓

调试行的代码,删除可惜,保留又碍事,所以我们可以选择性的编译。

举出下面的例子代码如下↓

在这里会举出两个例子①参与编译、②不参与编译。在这里我们先举出第②个例子↓

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>

int main(void)
{
#ifdef PRINT
	printf("hello C");
#endif 
}

运行结果如下↓

无,那么这个是为什么呢。实际上就是我们用了条件编译语句。把它给屏蔽了也就是不参与编译了。

代码语言:javascript
代码运行次数:0
复制
#ifdef PRINT
	//
#endif 

那么我们想让上面代码参与编译我们该怎么办呢。实际上很简单+#define 即可。

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
#define PRINT
int main(void)
{
#ifdef PRINT
	printf("hello C");
#endif 
}

运行结果🖊

hello C

🔥常见条件编译指令🔥

#if指令

  • 该指令检测表达式值是否为真。如果表达式的值为真,则编译后面的代码直到出现 #else、#elif 或 #endif 为止,否则不编译。

#endif指令

  • 该指令用于终止 #if 指令。

#else指令

  • 该指令用于 #if 指令之后,当前面的 #if 指令的条件不为真时,就编译 #else 后面的代码。
代码语言:javascript
代码运行次数:0
复制
//如果宏定义了PRINT执行,否则执行#else
#ifdef PRINT               
    printf("HELLO");
#else
    printf("C");
#endif 

#elif指令

  • 该指令综合了 #else 和 #if 指令的作用。下面的示例代码演示了 #if、#else、#elif 与 #endif 的组合使用情况。其实和else if()语句作用差不多都是配合#if来进行使用的多条件语句当中使用。

#ifdef 和 #ifndef 指令

  • 相对于 #if 指令(检测表达式的值是否为真),#ifdef 和 #ifndef 指令用于检测指令关键字后面的宏名称是否已经定义。其中,#ifdef 指令表示如果宏已经被定义,那么它的检测结果为真,否则返回假;而 #ifndef 指令的含义正好与 #ifdef 指令相反,它表示如果宏未被定义,那么它的检测结果为真,否则为假。

🙌三大要点

⒈为何要有条件编译?

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

⒉条件编译如何使用?

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🔥预定义符号🔥
    • 🔮日志🔮
  • 🔥条件编译🔥
  • 🔥常见条件编译指令🔥
    • 🙌三大要点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档