当前位置:网站首页>标准C语言13
标准C语言13
2022-07-27 03:22:00 【洛cs】
三十三、预处理指令
程序员所编写的代码不是真正的标准C语言,需要一段程序翻译成标准C语言,才可以被编译器编译
翻译的过程叫预处理、负责翻译的程序叫预处理器、被翻译的语句叫做预处理命令,
以#开头的都是预处理指令
gcc -E code.c 直接显示预处理后的结果
gcc code.c -o code.i 生成预处理文件
预处理指令的分类
#include 导入头文件/头文件包含
#include <> 从系统指定路径查找并导入头文件
#include "" 先从当前工作路径查找,找不到再从系统指定路径查找并导入头文件
gcc code.c -I path 编译时指定头文件的加载路径为path,最先该路径查找
可以设置环境变量来修改、增加系统指定头文件加载路径 修改 ~/.bashrc 终端配置文件
#define 定义宏 (替换)
宏常量: #define 宏名 常量值
其实本质上就是,在代码中出现了宏名的地方,在预处理是替换为对应的常量值
优点:提高可扩展性、提高可读性、提高安全性
还可以用在case后面
注意:宏名一般都大写,末尾不要加分号
局部变量,函数全部小写 全局变量首字母大写,
预定好的宏
__func__ 获取函数名
__FILE__ 获取文件名
__DATE__ 获取当前日期
__TIME__ 获取当前时间 %s
__LINE__ 获取当前行数 %d
宏函数: #define 宏名(函数名) 替换的代码
其实就是带参数的宏
宏函数不是真正的函数,不检查参数类型、没有传参、只有表达式的计算结果没有返回值
注意:宏函数后面的替换代码不能直接换行,需要在每一行末尾通过续行符\ 来代替
如果有多行代码,可以用大括号保护
#define SUM(a,b) a+b
SUM(num1,num2)
替换过程:
1.先把代码中使用宏函数的地方替换为宏函数后面的代码 a+b
2.在把宏函数代码中使用到的参数替换为调用者提供的数据 num1+num2
宏的二义性:
由于宏代码所处位置、参数位置、优先级的问题,导致同一个宏函数有不同的可解释的结果
如何避免宏的二义性:
1.给每个参数加小括号、给整个式子加小括号
2.使用宏函数时,不要提供带自变运算符的参数
运算符:
# 把宏函数的参数变成字符串。
## 把两个参数合并,变成标识符
条件编译:
根据条件决定哪些代码是否参与最终的编译
版本控制:
#if 条件
#elif 条件
#else 条件
#endif
头文件卫士:(防止头文件被 重复 包含)
#ifndef 宏名(头文件名大写,小数点用下划线代替)
#define 宏名
#endif//宏名
调试、判断:
#ifdef 宏名
如果宏名定义了,此处参与编译
#else
否则,此处参与编译
#endif
gcc code.c -D宏名(可以在编译时定义宏)
#if __cplusplus
printf("C++");
#else
printf("C");
#endif
//打印调试信息的宏函数
//是否打印调试信息,取决于是否定义了DEBUG宏
#ifdef DEBUG
#define debug(...) printf(__VA_ARGS__)
#else
#define debug(...)
#endif
//打印错误信息的宏函数
#define error(...) printf("%s:%s %d %s:%m %s %s\n",__FILE__,__func__,__LINE__,__VA_ARGS__,__DATE__,__TIME__)
三十四、头文件
头文件中应该写什么?
问题:头文件可能会被任意的源文件包含,意味着头文件会在多个目标同时存在,因此要满足合并内容不能有冲突
重点:头文件只能写声明语句,不能有定义语句。
函数声明、全局变量声明、宏常量、宏函数、typedef、
结构、联合、枚举的类型声明
头文件的编写原则:
1.每个.c文件编写一份同名的.h文件,.h文件是对.c文件的说明
2.如果需要用到某个.c文件的全局变量、函数、宏等内容时,只需要把它们的头文件导入
3. .c文件也要导入自己的.h文件,为了声明与定义一致
头文件的相互包含:
假设:
a.h包含了b.h,b.h又包含了a.h,此时编译会出错
解决方法:把a.h导入b.h的内容和b.h导入a.h的内容,提取出来写到另一个c.h
错误提示:未知类型名“xxxx”,大概率是头文件的相互包含
边栏推荐
- 【OBS】circlebuf
- ArrayList与LinkedList区别
- js实现页面跳转与参数获取加载
- scala 不可变Map 、 可变Map 、Map转换为其他数据类型
- Parallel desktop startup virtual machine "operation failed" problem solution
- 288页18万字智能化校园总体设计 目录
- Analysis of three common kinematic models of mobile chassis
- 面试题 16.05. 阶乘尾数
- Parallels Desktop启动虚拟机“操作失败”问题解决
- 【LeetCode】Day104-无重叠区间
猜你喜欢
![[Code] sword finger offer 04 search in two-dimensional array](/img/7d/a6693bfd24af9d9587539dda458d27.png)
[Code] sword finger offer 04 search in two-dimensional array

【小样本分割】MSANet: Multi-Similarity and Attention Guidance for Boosting Few-Shot Segmentation

Detailed analysis of trajectory generation tool in psins toolbox

356页14万字高端商业办公综合楼弱电智能化系统2022版

2022年危险化学品经营单位主要负责人复训题库及答案

Restful Fast Request 2022.2.2发布,支持批量导出文档

Towhee weekly model

什么是动画效果?什么是过渡效果?

452 pages, 130000 words, the overall solution of modern smart Township Xueliang project 2022 Edition

What is animation effect? What is the transition effect?
随机推荐
xxx is not in the sudoers file.This incident will be reported.的解决方法
First pass of routing strategy
What is the principle difference between lateinit and lazy in kotlin
Subject 3: Jinan Zhangqiu line 3
Redis database, which can be understood by zero foundation Xiaobai, is easy to learn and use!
452页13万字现代智慧乡镇雪亮工程整体解决方案2022版
【OBS】circlebuf
Leetcode daily question: relative sorting of arrays
Restful Fast Request 2022.2.2发布,支持批量导出文档
list模拟实现
H. 265 web player easyplayer's method of opening video to the public
【小样本分割】MSANet: Multi-Similarity and Attention Guidance for Boosting Few-Shot Segmentation
从根到叶的二进制数之和
JMeter download and installation
Manually build ABP framework from 0 -abp official complete solution and manually build simplified solution practice
H.265网页播放器EasyPlayer对外开放录像的方法
Subject 3: Jinan Zhangqiu line 5
Apachecon Asia preheating live broadcast incubator theme full review
BigDecimal踩坑总结&最佳实践
物联网智能家居项目---智能卧室