预处理指令

前言

预处理指令的解释及介绍


一、预处理指令

程序员所编写的代码并不能被真正的编译器编译,需要一段程序把代码翻译一下
翻译的过程叫做预处理指令,负责翻译的程序叫做预处理器,被翻译的代码叫做预处理指令,以#开头的代码都是预处理指令

查看预处理过程
gcc -E code.c 把预处理的姐夫哦显示到终端
gcc -E code.c -o code.i把预处理结果存储到code.i的预处理文件中

预处理指令的分类:
#include 文件包含
#include <> 从系统指定路径查找并导入头文件
#include “” 从当前路径下查找,如果找不到在从系统指定路径查找并导入头文件
通过编译参数指定查找路径 -I /path
操作系统通过设置环境变量来指定头文件的查找路径

#define 定义宏
宏常量: #denfine 宏名 数据
#define Max 50
优点:提高代码可读性、提高可扩展性(方便批量修改)、提高安全性、还可以用在case后面

注意:一般宏名全部大写,末尾不要加分号

预定义的宏:
func(两个下划线) 获取函数名 %s
FILE 获取文件名 %s
DATE 获取当前日期 %s
TIME 获取当前时间 %s
LINE 获取当前行号 %d

宏函数:带参数的宏
不是真正的函数,不检查参数类型,没有传参,没有返回值,只有表达式的计算结果
#define(a,b,c) a+b+c
1、先把代码替换为宏函数后面的表达式代码
2、把宏函数代码中使用的参数替换为调用者提供的数据

注意:宏常量、宏函数不能换行,可以使用续行符\放在末尾,也可以使用大括号保护代码

宏函数的二义性 :
由于宏函数所处的位置、参数不同导致宏函数有不同的解释和功能,这种叫做宏的二义性

如何避免二义性:
1、宏函数整体代码加小括号
2、每个参数都加小括号
3、使用宏函数时不要提供带自变运算符的变量作为参数
注意:容易出选择题,例如:那个宏有二义性、选择出宏函数的结果
# 把宏函数的参数变成字符串
## 把两个参数变成标识符

二、条件编译

根据条件决定让代码是否参与最终的编译

版本控制:
           #if
           #elif
           #else
           #endif
       头文件卫士:防止头文件重复包含
           #ifndef   宏名(头文件名全大写,_替代.)
           #define   宏名(头文件名全大写,_替代.)
           #endif//  宏名(头文件名全大写,_替代.)
       判断、调试代码:
           #ifdef 宏名 (DEBUG)
           #else
           #endif
           注意:可以通过编译参数-D宏名 定义宏

封装调试函数
       #ifdef DEBUG
          #define debug(...) printf(__VA_ARGS__);
       #else
          #define debug(...)
       #endif
       
 封装提示信息错误宏函数
#define error(...) printf("%s %s %s %m %d %s",__FILE__,__func__,__VA_ARGS__,__LINE__,__TIME__);

总结

提示:以上,有错误,还请指正

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值