预处理
新建一个 c 文件,hello.c
1 |
|
然后
1 | gcc ./hello.c |
在当前目录下生成 a.out 可执行文件。
1 | ./a.out |
输出 hello word 。
这个编译过程经过了四个步骤:
- .c 文件 -> .i 文件 预处理
- .i 文件 -> .s 文件 编译
- .s 文件 -> .o 文件 汇编
- .o 文件 -> .out 可执行文件 链接
预处理
1 | gcc -o hello.i hello.c -E |
宏定义
1 |
define 中是没有 c 语法的,只是单纯的字符串替换
宏非常简单,就是“替换”
宏函数
typedef
typedef 和预处理没什么关系, 但是和宏比较容易混淆.
它的作用是给变量类型起别名
条件编译
#if
1 | #if 整型常量表达式 1 |
它的意思是:如常“表达式 1”的值为真(非 0),就对“程序段 1”进行编译,否则就计算“表达式 2”,结果为
真的话就对“程序段 2”进行编译,为假的话就继续往下匹配,直到遇到值为真的表达式,或者遇到 #else。这一
点和 if else 非常类似。
需要注意的是,#if 命令要求判断条件为“整型常量表达式”,也就是说,表达式中不能包含变量,而且结果必须
是整数;而 if 后面的表达式没有限制,只要符合语法就行。这是 #if 和 if 的一个重要区别。
#ifdef
1 | #ifdef 宏名 |
它的意思是,如果当前的宏已被定义过,则对“程序段 1”进行编译,否则对“程序段 2”进行编译。
#ifndef
1 | #ifndef 宏名 |
与 #ifdef 相比,仅仅是将 #ifdef 改为了 #ifndef。它的意思是,如果当前的宏未被定义,则对“程序段 1”进行编
译,否则对“程序段 2”进行编译,这与 #ifdef 的功能正好相反。
三者之间的区别
最后需要注意的是,#if 后面跟的是“整型常量表达式”,而 #ifdef 和 #ifndef 后面跟的只能是一个宏名,不能是
其他的。