一、预处理
概念:
在C语言程序源码中,凡是以井号(#)开头的语句被称为预处理语句,这些语句严格意义上并不属于C语言语法的范畴,它们在编译的阶段统一由所谓预处理器(cc1)来处理。所谓预处理,顾名思义,指的是真正的C程序编译之前预先进行的一些处理步骤,这些预处理指令包括:
-
头文件:#include
-
定义宏:#define
-
取消宏:#undef
-
条件编译:#if、#ifdef、#ifndef、#else、#elif、#endif
-
显示错误:#error
-
修改当前文件名和行号:#line
-
向编译器传送特定指令:#progma
基本语法
- 一个逻辑行只能出现一条预处理指令,多个物理行需要用反斜杠连接成一个逻辑行
- 预处理是整个编译全过程的第一步:预处理 - 编译 - 汇编 - 链接
- 可以通过如下编译选项来指定来限定编译器只进行预处理操作:gcc example.c -o example.i -E
编译过程
编译过程分为以下四个阶段:
1)预处理:处理预处理语句(#开头的语句),删除注释、头文件展开、宏替换...
gcc hello.c -o hello.i -E
2)编译:将C语言程序转化为汇编语言
gcc hello.c -o hello.s -S
3)汇编:将程序代码转化为二进制代码
gcc hello.c -o hello.o -c
4)链接:将所有二进制代码合并起来,根据应用规则生成一个专门针对某个平台执行的应用程序镜像
gcc hello.c -o hello
二、宏
1.概念
宏(macro)实际上就是一段特定的字串,在源码中用以替换为指定的表达式。
#define PI 3.14
此处,PI 就是宏(宏一般习惯用大写字母表达,以区分于变量和函数,但这并不是语法规定,只是一种习惯),是一段特定的字串,这个字串在源码中出现时,将被替换为3.14。
#include <stdio.h>
#define PI 3.14
int main()
{
printf("圆周率:%f\n",PI);
return 0;
}
宏的作用:
使得程序更具可读性:字串单词一般比纯数字更容易让人理解其含义。
使得程序修改更容易:修改宏定义,即修改了所有该宏替换的表达式。
提高程序的运行效率:程序的执行不再需要函数切换开销,而是就地