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

被折叠的 条评论
为什么被折叠?



