当前位置: 首页 > 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语言的初学者有问题随时都可以问我,随时为您解惑!!!

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

相关文章:

  • 【MySQL从入门到精通】【高级篇】(二十六)建了索引就能用么?我看未必。来看看几种索引失效的情况吧
  • leetcode47全排列2刷题打卡
  • HTTP首部的那些事,通用首部,请求首部
  • 【C基础篇】之C语言概述
  • 【运维】linux shell 编程之函数使用
  • 【MATLAB教程案例25】常用图像变换域的matlab仿真分析——DFT频域,DCT域,小波域等
  • 【C++】类和对象(中)(万字详解)
  • 18-CSS3的2D和3D属性
  • 浅谈Linux下的redis攻击
  • 高频故障-忘记网页上已保存的密码解决方案
  • 大衣哥后悔了吗?谷传民绕开音乐进军影视结盟湖南操场邓铃
  • 图像的阴影检测消除和图像重建算法matlab仿真
  • 【ESP32】Arduino C语言语法总结
  • Hive调优策略之SQL优化
  • 【网站架构】4核CPU的MySQL调优3万RPS吞吐量?数据库集群高可用
  • 【node学习】协程
  • Brief introduction of how to 'Call, Apply and Bind'
  • Fundebug计费标准解释:事件数是如何定义的?
  • Hexo+码云+git快速搭建免费的静态Blog
  • leetcode98. Validate Binary Search Tree
  • Vue--数据传输
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 编写符合Python风格的对象
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • nb
  • 【干货分享】dos命令大全
  • Prometheus VS InfluxDB
  • ​io --- 处理流的核心工具​
  • #{}和${}的区别?
  • #define
  • #pragma预处理命令
  • (2.2w字)前端单元测试之Jest详解篇
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (LeetCode) T14. Longest Common Prefix
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (搬运以学习)flask 上下文的实现
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (汇总)os模块以及shutil模块对文件的操作
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net 无限分类
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net反混淆脱壳工具de4dot的使用
  • .NET连接MongoDB数据库实例教程
  • .Net中ListT 泛型转成DataTable、DataSet
  • .NET中使用Redis (二)
  • @RequestBody与@ResponseBody的使用
  • @vue/cli脚手架
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [1]-基于图搜索的路径规划基础