8.1 宏定义

回顾一下前面讲过的内容,针对一个项目,有两种说法:

(1)一个项目,由一个或者多个源程序文件组成。

(2)一个项目,可以通过编译、链接(Visual Studio负责做这件事)最终生成一个可执行文件。

这里谈到的编译,是以一个一个的源程序文件(.cpp文件)为单位进行的,每个源程序文件都会编译成一个目标文件(目标文件扩展名可能是.o也可能是.obj等,这与操作系统类型有关),如果源程序文件有多个,则会编译生成多个目标文件,然后将这些目标文件进行链接,最终生成一个可执行文件。

那么,编译这个动作或者称为阶段,都干了什么事呢?一般来说,编译阶段会做如下几件事:

(1)预处理。

(2)编译。包括词法分析、语法分析、目标代码生成、优化等。

(3)汇编。产生.o(.obj)目标文件。

假设一个项目中包含a.cpp、b.cpp、c.cpp三个源文件,图8.1展示了最终生成一个可执行文件的过程。

不需要深究图8.1中所提到的术语的深入含义,这里重点要说一下“预处理”这个概念。

在软件开发过程中,根据实际需要,会在源程序文件中写入一些特殊代码(特殊命令),这些特殊代码有一些特殊能力,提供一些特殊功能,编译系统(Visual Studio中内置)会先对这些特殊代码做预先的处理,这就叫“预处理”,处理的结果再和源程序代码一起进行上面步骤中提到的编译、汇编等一系列动作。

C语言一般提供三种预处理功能:宏定义、文件包含、条件编译。这三种预处理功能也是通过在源程序文件写入代码来实现的,只不过这些代码比较特殊,都是以“#”开头。本节先要讲解“宏定义”。

图8.1 包含多个.cpp源文件的一个项目生成可执行文件的过程