C语言的预处理

昨天结束了C语言的指针,为什么没有继续写博客,因为我感觉自己到后面还是有点晕,理解的不是很清楚,等我再进修一下,再出一篇详细的C语言指针吧!今天来学C语言的预处理。

在前面我们写代码时经常用到以**“#”**开头的代码,以“#”开头的就是预处理命令。如:
#include<stdio.h>
#define PI 3.1415926
在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,因为它们通常被更早的处理,它们就称为预处理部分。

无参宏的定义:

无参宏的宏明后不带参数。
定义的一般形式为:
#define 标识符 字符串
其中,“#”表示这是一条预处理命令。
凡是以“#”开头的均为预处理命令。
define为宏定义命令。“标识符”为所定义的宏名。“标识符”可以是常数、表达式、格式串等。如:
#define PI 3.1415926
这个作用就是指定用PI来代替数3.1415926,下面代码中所有的PI都代表3.1415926
看代码实例:
在这里插入图片描述
这样做主要是为了减少我们写代码时的工作量,也会减少出错,毕竟PI比3.1416926更好敲。

注意:
——宏定义不是说明或语句,在行末不必加分号,如果加上分号则连分号一起置换掉。
——宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如果要终止其作用域可以用#undef命令。
——宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。
——宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。
——习惯上宏名用大写字母表示,以便与变量区别。但也允许用小写字母。
如实例:
在这里插入图片描述

宏定义表示数据类型和用typedef定义数据说明符的区别。

区别:宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,他不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。typedef后面有分号,表示它是一个语句。
在这里插入图片描述
仔细想想上面的代码!!

其次,对“输出格式”作宏定义,可以减少书写麻烦。如实例:
在这里插入图片描述

带参宏定义(高手阶段)

C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
带参宏调用的一般形式为:宏名(实参表)
在这里插入图片描述
在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:k=55+35
在这里插入图片描述
对于带参的宏定义有以下注意事项:
1.带参宏定义中,宏名和形参表之间不能有空格出现。如:
在这里插入图片描述
2.在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。
在这里插入图片描述
3.在带参宏中,只是符号代换,不存在值传递的问题。
4.在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
在这里插入图片描述
5.在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
在这里插入图片描述
在这里插入图片描述
对比上面两个代码,运行结果是不一样的,不带括号由于运算优先级不同会导致出错。
6.宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。

文件包含:
1.一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。
2.文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。
3,包含命令中的文件名可以用双引号括起来,也可以使用尖括号括起来。例如:
在这里插入图片描述
但是这两种形式也是有区别的:使用尖括号表示在包含文件目录去查找,而不是在源文件目录去查找。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值