预处理:
编程流程:
1.编辑
2.编译 gcc main.c //a.out
3.运行
4.调试
编译过程:
1.预处理
//预编译 -- 将 代码中相关 预处理命令执行 最终生产一个 只包含c语言代码的文件
2.编译
//编译 -- 对语法进行检查,将这个c的源代码 生产 汇编代码
3.汇编
//汇编 -- 表示将 汇编源代码 最终生成 机器代码 //object
4.链接
//链接 -- 将使用到的其它代码了链接到一起 生成 最终可执行文件
------------------------------------------------------------------------------------
预处理:
//作为文本的替换
1.宏定义
2.文件包含
3.条件编译
1.宏定义
语法:
// #define 标识符 字符串
#define 宏名 宏值
注意:
1. 预处理命令 都是以 # 开头的
2. 宏名 命名规则 和 之前标识符命名规则一致
注:
宏名一般都写大写 ,以区别与普通变量名
3. 预处理 实际上 是将 宏名 用 宏值(预处理阶段的 字符串) 原样替换
//文本替换
注意:
c语言字符串中出现的 "宏名" 不会被替换
4. 应用
a. 提高代码可读性
b. 一改全改,方便代码修改
5. 宏名的 作用域
#undef 宏名
表示 取消 宏名的 定义
注意:
只是在预处理阶段发挥作用。
作用范围:
从定义处开始,到 #undef 结束
例:
#define N 10
int n; //变量名
含义:
表示将来 代码中出现的N 都代表10
则:
编写代码时,可以使用N表示数字10
带参宏定义: //宏函数
语法:
#define 宏名(参数) 宏值
例:
#define ADD(a,b) a+b
注意:
1.带参宏和函数有本质的区别
a.处理阶段不一样
宏定义 --预处理阶段
函数 --编译阶段
b.使用不一样
宏 -- 预处理阶段 就使用结束了
宏的使用,本质上,是文本的原样替换
参数
宏的参数,只是进行 文本替换用,不进行语法检查
函数 -- 调用时,进行使用
函数的使用,本质上是函数代码的调用
参数
函数的参数,是有类型的,编译阶段是要进行类型检查的
c.应用
一般对于一些短小代码 ,考虑写成带参宏
不超过5行的代码
d.宏的副作用
处理:
把能加括号的地方都加括号
e.注意
宏定义 必须 写在一行
续行符
文件包含 :
#include <文件名>
#include "文件名"
< > 与 " "
区别:
在于,查找头文件的方式不一样
<> //到系统默认的路径寻找对应的头文件
"" //表示先到当下目录下寻找头文件,如没有,再到系统默认路径下寻找
条件编译
(1).
#ifdef 标识符
程序段 1
#else
程序段 2
#endif
含义:
如果 定义了 标识符
则 预处理程序段1 //就是将程序段1的代码 保留
否则
保留程序段2
用途:
//1.调试代码
//2.设计头文件
(2)
#ifndef 标识符
程序段1
#else
程序段2
#endif
含义:
如果 没有定义了 标识符
则 预处理 程序段1 //就是将程序段1的代码 保留
否则
处理 程序段2
(3)
#if 表达式
程序段1
#else
程序段2
#endif
含义:
表达式为真 处理程序段1 表达式为假 处理程度段2