1、c程序执行过程
c语言由源码文件编程可执行文件分为4步: 
预处理:由.c文件转为.i文件的过程就叫预处理 编译:.i文件生成.s文件的过程叫编译 汇编:.s文件生成.o文件的过程叫汇编 链接:.o文件生成可执行文件的过程叫链接
2、预处理
下方的参数-E 表示gcc只做预处理即可。 下方命令将helloworld.c预处理成一个helloworld.i预处理文件。 gcc -o helloworld.i helloworld.c -E 下图中将头文件stdio.h 与hellworld.c文件中的代码进行和合并。 
预处理做的第一件事就是展开头文件,同时宏替换也要在预处理时进行。
2、宏替换
#include <stdio.h>
#define R 10
int main()
{
int a = R;
printf("a=%d\n", a);
printf("hello world");
return 0;
}
将上方代码进行预处理,再查看预处理文件,如下图  由上图可知,预处理阶段,宏会被编译器替换成对应的值。
注意:宏替换只是单纯的字符串的替换,是不会考虑c的语法的,如下方代码。
#include <stdio.h>
#define M int main(
M){
printf("上方的M会被替换成int main(\n");
return 0;
}
上方代码经过预处理命令gcc -o helloworld.i helloworld.c -E 之后,helloworld.i中的内容如下图 
2.1、宏函数
#include <stdio.h>
#define R 20
#define M int main(
#define N(n) n*10
M){
int a = R;
printf("a=%d\n", a);
int b = N(a);
printf("b=%d\n",b);
return 0;
}
上方代码预处理之后的结果,如下图: 
2.2、宏函数注意事项(运算符优先级)
因为宏函数是直接进行字符替换,所以需要注意下图的错误

上方的宏函数定义一定要加括号
#include <stdio.h>
#define ADD(a,b) (a+b)
int main(){
int b = ADD(2,3) * ADD(2,3);
printf("b=%d\n",b);
return 0;
}

2.3、宏函数的优势

2.4 条件编译
@todo
|