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

【初学者入门C语言】之编译预处理(十)

个人主页:天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主

💬 刷题网站:一款立志于C语言的题库网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com) 

 特别标注:该博主将长期更新c语言内容,初学c语言的友友们,订阅我的《初学者入门C语言》专栏,关注博主不迷路!

目录

前言

文件包含

#include

两种格式

#include<头文件名称>

#include"头文件名称"

头文件包含的顺序

宏定义

嵌套宏

举例

 有参数的宏定义

格式

举例

易错点

总结


前言

预编译伪指令一般都以#打头,且前面不能有其他字符,只能出现空白字符,执行过程是C的编译处理器对预编译伪指令进行处理后生成中间文件作为编译器的输入,因此所有的预编译伪指令都不会进入编译阶段。

文件包含

#include

#include伪指令用于包含一个头文件,头文件中存放的一般是模块接口,编译预处理器在扫描到伪指令后就用对应的文本内容替换它。

两种格式

#include<头文件名称>

一般用于包含的是头文件,指示编译预处理器在开发环境设定的搜素路径中查找所需要的头文件

#include"头文件名称"

一般用来包含自己编写的头文件。

头文件包含的顺序

1.当前所需的自定义头文件

2.第三方程序库的头文件

3.标准头文件

宏定义

宏定义相当于自己定义一个常量,宏定义具有文件作用域,宏定义晚后,后面任意一个地方都可以引用宏。

宏定义不是C语句,所以不需要使用语句结束符“;”

格式:

#define 宏名 宏体

举例

#define PI 3.14

为了便于区分,宏名为大写字母

嵌套宏

先完成一个宏定义,在第二个宏定义的宏体中包含了第一次宏定义的宏名

举例

#define PI 3.14

#define PI_2 (2*PI)

代码

#include <stdio.h>
#define PI 3.14
#define PI_2 2*PI

int main() {
	int r = 3;
	float l;
	l = PI_2 * r;
	printf("%.2f", l);
	return 0;
}

执行结果

 有参数的宏定义

与函数类似,宏定义中的参数称为形式参数

格式

#define 宏名(形参表) 宏体

举例

#define F(x,y) 2*x+y

代码

#include <stdio.h>
#define F(x,y) 2*x+y

int main() {
	int x = 2;
	int y = 3;
	int z = F(x, y);
	printf("%d", z);
	return 0;
}

执行结果

注意宏定义宏体是否加括号的运算结果是不同的 ,举例如下:

易错点

1.#define F (x*x+3*x)

代码

#include <stdio.h>
#define F (x*x+3*x)

int main() {
	int x = 2;
	int z = 3 * F + 4;
	printf("%d", z);
	return 0;
}

运行结果

带括号的执行的时候是3*(x*x+3*x)+4即3*(2*2+3*2)+4也就是34

2.#define F x*x+3*x

代码

#include <stdio.h>
#define F x*x+3*x

int main() {
	int x = 2;
	int z = 3 * F + 4;
	printf("%d", z);
	return 0;
}

执行结果

 不带括号的执行的时候是3*x*x+3*x+4即3*2*2+3*2+4也就是22

由上面两个例子可以看出宏定义到括号和不带括号是完全不一样的,这点十分容易错,大家一定要小心

总结

理解包含头文件,清楚头文件的两种格式,掌握宏定义及其嵌套,能够区分宏定义带括号和不带括号的区别。

各位C语言的初学者有问题随时都可以问我,随时为您解惑!!!

👍+✏️+⭐️是对博主最大的鼓励与支持!!!

相关文章:

  • 密文字段模糊检索方案
  • Redis中set数据类型详解
  • Linux应用开发-进程间通信-管道
  • 计算机视觉——手机目标检测数据集
  • (十四)C++自制植物大战僵尸游戏windows平台视频播放实现
  • 从二本调剂到上海互联网公司算法工程师:我的成长故事
  • Rust调用同级目录中的rs文件和调用下级目录中的rs文件
  • 计算机网络-网络互联
  • LeetCode 刷题 [C++] 第240题.搜索二维矩阵 II
  • Flutter中高级JSON处理:使用json_serializable进行深入定制
  • mybatis---->tx中weekend类
  • 【王道数据结构】【chapter7查找】【P285t5】
  • 【JavaWeb】之Maven
  • 牛客网专项练习30天Pytnon篇第25天
  • 【RPA前置知识】 整理并总结 Assign 和 AssignT 类
  • SpringBoot整合RabbitMq实现ACK机制--消息回退机制--消息确认机制
  • 关于“八音盒自定义弹奏”的一些想法
  • linux学习(青少年学Linux)
  • 从此刻开始走进HTML的大门!!!
  • TCP通信相关函数
  • Codeforces Global Round 23(A~C)
  • wy的leetcode刷题记录_Day15
  • GAMES104 雾系统、反走样与后处理
  • 成员方法传参机制
  • mac苹果通过pycharm进行ssh远程连接服务器(Ubuntu)
  • AJAX异步请求(Asynchronous Javascript And Xml)
  • Android12 A2DP连接[1]
  • JAVA SE_part.2
  • 5.HttpServletRequest类
  • 【SQL刷题】秋招刷爆SQL题之插入数据
  • 刷爆leetcode第九期 0020
  • Colmap安装与实践