编译过程与预处理

1.编写文本代码,C或Cpp文件

2.编译,就是Compile,由C编译程序对你写的代码进行词法和语法分析,发现并报告错误。
如若无错,则生成中间代码,扩展名.obj,此时是二进制


3.链接,Link,生成可执行的Exe文件。由于一个程序的源码可由多个文件组成。这些文件在第二步
中分别编译,生成各自的目标文件,这一步的作用便是将这些Obj文件,以及程序中需要的其它库文件(Dll除开),统一到一个文件中来,形成单个的Exe 文件。此Exe文件便可以在操作系统下直接运行了。


源文件-->预编译处理-->编译(优化,汇编程序)-->链接程序–>可执行文件

预处理:编译成目标文件前对源程序进行处理


宏处理 #define

预处理指令#开头,无逗号,可出现在任意位置,作用域为出现位置到文件结尾

1
2
3
4
5
6
7
8
9
10
#define 一改全改
#define PI 3.14
#define MAX(a, b) (a > b ? a : b)


#define Add(a,b) a+b
c * Add(a,b) * d == c * a + b * d,导致计算错误,解决方法是在a+b中加上括号(a + b )


#undef 宏名 //取消宏定义



1
2
3
4
5
6
7
8
9
10
11
12
多行定义 \

#define MAX(a, b) (a > b ? \
a : b)


#define APG_DELETE(p) do{ delete p; p = NULL} while(0)

if(NULL != p) APG_DELETE(p)
else ...do sth...
if(NULL != p) AGP_DELETE(p);
else ...do sth...



文件包含 #include

#include<头文件名称>: 先在系统路径搜索文件(一般是include)
#include"头文件名称":先在当前目录搜索



条件编译与#program

1
2
3
#if 0或1  //如果是0则不编译,如果是1则编译

#endif



1
2
3
4
5
#ifdef 宏名 //如果宏名已定义,执行块1,否则执行块2
块1....
#else
块2.....
#endif



1
2
3
4
#ifndef 宏名 //如果宏名没有定义,我们就定义一个这样的宏,防止头文件被重复包含
#define 宏名
...
#endif



1
#program once //防止头文件被重复包含,只能在vs中用