c的预处理
c的编译流程
- 预处理阶段
- 编译阶段
- 汇编阶段
- 链接阶段
- 运行可执行文件
查看预处理阶段的变化
源文件 src/pretreatment.c
/* src/pretreatment.c */
#include "pretreatment.h"
#define HAHAHA 1;
typedef unsigned int uint;
int main(void)
{
int a = HAHAHA;
return 0;
}
源文件 include/pretreatment.h
int pretreatment = 11;
使用gcc
的E
选项预编译
gcc -E -o bin/pretreatment.i src/pretreatment.c -I include
编译后内容
# 1 "src/pretreatment.c"
# 1 "<built-in>"
# 1 "<命令行>"
# 1 "src/pretreatment.c"
# 1 "include/pretreatment.h" 1
int pretreatment = 11;
# 2 "src/pretreatment.c" 2
typedef unsigned int uint;
int main(void)
{
int a = 1;;
return 0;
}
编译出来的文件还是文本文件,只是对预编译指令作了处理,如把宏替换,把#include
用饱含的文件内容替换
预处理的概念
- 预编译指令:以
#
开头的为预处理指令,如#define
,#include
等,在源程序中这些指令都放在函数外,而且一般都放在源文件的前面,他们被称为预处理部分。 - 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是c语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。
- 预处理在源代码编译之前对其进行一些文本性质的操作,在源程序编译之前作一些处理,生成扩展的c源程序。
预处理的任务
- 删除注释
- 插入被
#include
指令包含的文件内容 - 定义和替换由
#define
指令定义的符号(宏替换或宏展开) - 条件编译
预处理指令的格式
- 以
#
开头 - 占单独书写行
- 语句尾不加分好
合理的使用预处理,编写的程序便于阅读,修改,移植和调试,也有利于模块化的设计
宏定义的概念
- 在c程序源程序中允许使用一个标识符来表示一个字符串,成为
宏
,在预处理时,对程序中所有出现的宏,都用宏定义的字符串去替换,这称为宏替换或宏展开 - 宏定义是由源程序中的宏定义指令完成的,宏替换是由预处理程序自动完成的
- 在c语言中,宏定义分为无参宏定义和带参宏定义