4.预处理
4.1 c语言的编译过程
gcc -E hello.c -o hello.i # 1.预编译
gcc -S hello.i -o hello.s # 2. 编译
gcc -c hello.s -o hello.o # 3. 汇编
gcc hello.o -o hello_elf # 4. 链接
-
预编译
将
.c
中的头文件展开、宏展开 -
编译
将预处理之后的
.i
文件生成.s
汇编文件 -
汇编
将
.s
汇编文件生成.o
目标文件 -
链接
将
.o
文件链接成目标文件
4.2 include
#include <> // 用尖括号包含头文件,在系统指定的目录下找头文件
#include "" // 用双引号包含头文件,在当前目录下找头文件;如果找不到,再到系统目录下找,一般自定义函数使用
注意:
- include也可以用来包含
.c
文件,但是不建议。因为这样会导致.c
文件在预编译阶段被展开,如果一个.c
被多次展开,会导致重复定义,所以不建议包含.c
文件。 - 预处理只是对include等预处理操作进行处理,不会进行语法检查,所以这一阶段即便代码有语法错误也不会报错。
4.3 define
定义宏用define,宏是在预编译的时候进行替换
-
不带参宏
#define PI 3.1415926
注意:宏定义后边不用加分号
-
带参宏
#define S(a,b) (a)*(b)
#include <stdio.h> #define PI 3.1415926 #define S(a,b) a*b int main(){ printf("PI = %lf\n",PI); printf("a * b = %d",S(2,4)); }
输出结果
PI = 3.141593 a * b = 8
带参宏与带参函数
-
带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈,这是一种空间换时间的做法。
带参函数,调用的时候需要压栈弹栈,浪费了时间,节省了空间。
-
带参函数的形参是有类型的,带参宏的形参是没有类型名的。
-
功能简单,不需要太多空间,可选用带参宏;大多数情况下还是选择带参函数
-
4.4 选择性编译
-
第一种形式
// 如果当前的.c 中定义过AAA,就会编译代码段1,否则编译 代码段2 #ifdef AAA 代码段1 #else 代码段2 #endif
-
第二种形式
// 该形式与第一种形式形成互补,这种方法可以防止头文件重复包含 #ifndef AAA 代码段1 #else 代码段2 #endif
-
第三种形式
// 如果表达式为真,执行代码段1,否则执行代码段2 #if 表达式 代码段1 #else 代码段2 #endif
选择性编译都是预编译阶段干的事情。
标签:02,头文件,17,代码段,C语言,编译,include,hello,define From: https://www.cnblogs.com/hasaki-yasuo/p/18018044