这里只是简要的概述,概念性的理解。深入理解,望君研读《编译原理》。此处广告:当当有售!
一、何为编译
编译就是把 .h和.cpp文件翻译成计算机能够执行的二进制文件(比如:windows中的一种,exe,还有.dll),该文件格式由操作系统定义。这和.doc格式的word文档没什么本质分别,里面有对应的二进制告诉你,哪里换行,哪里加粗,哪里开始,哪里是文档的结尾。
二、从代码到EXE之路
从一堆 .h和.cpp到.exe,要经过预编译、编译、链接三道关卡。
(一) 预编译(precompile):主要进行“宏展开”操作,就是对那些#***的命令的一种展开
#ifndef MAIN_HEADER
#define MAIN_HEADER
#include "stdafx.h"
#define PI 3.1415926
struct xx
{
};
class XX
{
};
#endif
例1:define PI 3.1415926 就是建立起PI和3.1415926之间的映射关系,好在编译阶段将PI替换位3.1415926。
例2:ifndef/endif就是从一个文件中有选择性的挑出一些符合条件的代码来交给下一步的编译阶段来处理。这里,MAIN_HEADER就是该段代码的一个标识符(自定义,不可重复,常与文件名相关)。如果定义了这个宏标识符,这下面的代码就不用编译了,如果没有则编译。保证该段代码只编译一次。这个宏命令用法强大,用处多多。详解可以参看:https://blog.csdn.net/loop_k/article/details/4972811。
例3:啊,include!相当于把xxx.h文件里面的内容复制一份到这条include "xxx.h"语句的地方来。.h里面还有include怎么办?那就嵌套式继续复制替换呗!假如下面这种情况:AB.cpp中包含A和B两个头文件,而AB都包含C头文件,那就通过例2的方法保证C头文件的内容只复制一次。如果在两个不同的.cpp中同时包含F.h怎么办?答:各复制各的,互不干扰。C++的铁律就是先声明后使用,不声明就想使用,想上天呀!哈哈!
// AB.CPP:
#include "A.h"
#include "B.h"
D::D()
{
}
// A.h:
#include "C.h"
struct A
{
}
// B.h:
#include "C.h"
struct B
{
}
(二) 编译(compile):编译器对源文件进行编译,把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件。