C语言进阶版第21课—预处理

1. 预定义符号

  • C语言定义了一些预定义符号,可直接使用,预定义符号也是在预处理阶段处理的
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器支持ANCI C语法规则,那么该值是1

在这里插入图片描述


2. #define定义常量

在这里插入图片描述


  • #define定义标识符时需要在末尾加分号;吗???

在这里插入图片描述


3. #define定义宏

  • C语言允许将参数替换到文本中,通常称为宏,定义如下:
  • #define name(parament-list) stuff
  • 其中name是宏名,parament-list是宏的参数,stuff是宏体
  • 其中参数列表左边的括号必须与宏名紧挨着,中间不允许有空格
  • 简单举个例子
    在这里插入图片描述

  • 上述代码有没有问题呢?接下来我们再看一个例子

在这里插入图片描述


  • 因此为了避免出现优先级的问题,通常会为宏体的每个参数加上括号

在这里插入图片描述


  • 为宏体里的每个参数加上括号,真的就万事大吉了吗?

在这里插入图片描述


  • 因此我们不仅要为宏的每个参数加上括号,同时还需要为整个宏体加上括号

在这里插入图片描述


4. 带有副作用的宏参数

  • 当宏参数在宏定义时出现次数超过一次时,如果参数有副作用,那么使用宏就会出错

在这里插入图片描述


在这里插入图片描述


5. 宏替换的原则

  • 调用宏时,主要是对#define定义的标识符替换成对应的宏体
  • 宏参数和#define定义中可以出现其他#define定义的符号,但是宏不能递归

6. 宏和函数的对比

  • 宏通常用于简单运算

在这里插入图片描述


  • 和函数相比,宏的劣势:
  • 第一点就是宏用于简单的计算比函数有优势,执行复杂的程序时使用宏会出错
  • 第二点就是宏没有类型的要求,这就使得其并不严谨,因此这也是宏的优点
  • 第三点就是宏无法调式,同时因为优先级的问题,经常导致其出错

在这里插入图片描述


  • 宏也可以做到函数做不到的事

在这里插入图片描述


属性#define定义宏函数
代码长度可用于长度小的代码中代码长,复杂度高直接使用函数(√)
执行速度更快(√)存在函数调用和返回参数的额外操作,导致执行速度变慢
操作符优先级为了不出错,使用宏时尽可能多写括号容易预测(√)
带有副作用的参数不容易预测容易预测(√)
参数类型无限制限制
调试不可调试可调试(√)
递归不可递归可递归(√)

7. #运算符和##运算符

7.1 #运算符

  • 字符串合并打印

在这里插入图片描述


在这里插入图片描述


7.2 ##运算符

  • ##可以把它两边的符号合成一个符号

在这里插入图片描述


在这里插入图片描述


8. 命名约定

  • 宏一般都是大写,函数一般首字母大写

9. #undef

  • 它通常用来移除一个宏定义
    在这里插入图片描述

10. 条件编译

  • #if 常量表达式 …… #endif
    在这里插入图片描述

  • #ifdef 符号或语句 …… #endif
    在这里插入图片描述

  • 多个分支的条件编译
  • #if 常量表达式 ……#elif 常量表达式……#else……#endif
    在这里插入图片描述

  • #if defined ……#ifdef……#ifndef……#endif
    在这里插入图片描述

  • 嵌套使用
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值