预处理命令是 C 语言开发中不可或缺的一部分,它们在编译之前对源代码进行文本替换、文件包含和条件编译等操作,极大地提高了代码的灵活性、可维护性和可移植性。掌握预处理命令的使用,是编写高质量 C 语言程序的基础。
目录
- GCC 编译步骤
- 宏定义
- 头文件包含
- 条件编译
预处理命令
1. GCC 编译的四个步骤
gcc main.c ————> a.out
预处理:展开和 # 相关的代码:展开头文件、展开宏、处理预处理命令
#include <stdio.h>
#define PI 3.1415
#if 0
#endif
gcc -E main.c -o main.i;
编译:将 C 语言程序转换为汇编指令。
gcc -S main.i -o main.s;
汇编:将汇编指令转换为二进制可执行程序
gcc -c main.s -o main.o;
链接:负责链接系统的函数/库函数的实现
gcc main.o -o main;
2. 预处理命令
宏定义
#define 标识符 值 #define PI 3.1415注意:
1. 宏作为预处理命令,负责在预处理阶段展开,不做运算,只是代码的替换
2. 宏标识符最好大写,定义宏不能加分号
3. 宏只是代码的替换,能加括号就加括号
4. 宏和函数的区别:宏是预处理阶段的代码替换,会使得代码体积增大。函数是在运行时调用,需要保护现场和恢复现场。
带参宏(宏函数)
#define 标识符(参数1, 参数2, ...) 宏的实现 #define ADD(A, B) A + B
头文件包含
#include <stdio.h> #include "head.h" 自己编写的头文件: 可以有包含的其他头文件 声明的数据类型 宏定义 函数和全局变量的声明
注意:
1. <> 表示包含的是系统中的头文件,让编译器从系统路径下找
2. "" 表示包含的头文件是用户自己定义的头文件,让编译器在当前路径下找
条件编译
1. 头文件中防止头文件重复包含
#ifndef 宏 #define 宏 // 头文件内容 #endif 根据宏有没有被定义出来决定该头文件中的内容要不要加入到编译中
2. 条件编译
#if 逻辑结果表达式 // 代码 #endif 根据逻辑结果表达式的结果,决定中间的代码要不要加入到编译中 代码屏蔽 #if 0 代码 #endif#ifdef 宏 // 代码1 #else // 代码2 #endif 根据宏有没有被定义决定编译代码1还是代码2 #ifndef 宏 // 代码1 #else // 代码 #endif