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