C++Primer Plus 6th 2.6复习题解答 第2题
题目:
2.下面的预处理器编译指令是做什么用的?
#include <iostream>
答案:这将导致在最终的编译之前,使用iostream文件的内容替换该编译指令。
C++技术网辅导详解解答:
书上的答案,这样解释,可能对新手来讲还不够明白,有些点还需要详细剖析一下。想弄明白这个答案,我们需要理解几个概念:处理器、预处理器、编译、编译指令、include、内容替换。
1.处理器
所谓处理器,简单来讲,其实就是处理一个事情的工具。比如电脑的处理器CPU,就是用来计算的工具。不管是什么程序,最底层还是CPU在处理的,都是用类似的计算模式工作。所以看起来电脑什么功能都能做,但是底层确是一样的计算。在上层因为不同的组合而实现不同的功能。好比我们建房子,工匠只是不停的垒砖,而因为垒砖的组合不同而形成不同造型的房子。
生成程序,是通过将文本文件的源代码编译成二进制的指令文件。不管是什么样的程序,底层的编译工作基本上差不多,就和垒砖一样。那么编译这件事情就是编译器所做的工作。那么此处的处理器指的就是编译程序的编译器了。
根据处理事情的不同,我们可以将各种工具命名为不同的处理器。电脑的处理器叫做CPU,显卡的处理器叫做GPU,编译程序的程序叫做编译器,链接程序的程序叫做链接器,运行程序的叫做加载器。
2.预处理器
预处理器,含义为预先处理的处理器,此处理器的工作先于处理器。预处理器处理完后,将结果再给处理器处理。公司老板通常都有助理或秘书,对于基本的准备工作,都是助理或秘书做的,然后老板继续做剩下来的事情。那么助理或秘书就相当于预处理器,而老板就是处理器。
3.编译
编译的概念,实际上是编排整理和翻译。编排整理自然就是将凌乱的源代码进行一番归类整合,这样才更好做翻译,省去不必要的工作。对于重复的代码,这样就只需要翻译一遍就行了。
那么什么是翻译呢?我们程序员写的代码是源代码,源代码是人类可读的,按照语言的规则写的。而这些规则对计算机是天书,是看不懂的。而计算机能懂的是二进制的0101...指令,对人类来讲,那也是天书。所以需要一个工具将源代码和二进制指令做一个转换,这其实就是翻译。好比中文和英文的转换,就是中英翻译。
所以我们写的代码,要在计算机中运行起来,必须经过编译。一些语言需要主动编译(静态编译),编译好了再执行,如C语言。而脚本语言,是被动编译(动态编译),边编译边执行,如python语言。
4.编译指令
在编译的过程中,是先将源代码读取到内存,然后再执行编译的工作。我们的源代码中,既包含了被编译的代码,当然也要包含要预先编译的代码。预先编译的代码当然是要给预处理器执行。而要被编译的代码自然是要给编译器执行。在同一份代码里,要区分编译器执行的代码和预处理器的代码,如何办到?这就是预编译指令的作用。有了预编译指令,编译工具(IDE)会事先将预编译指令指明要做的工作丢给预处理器去做,而编译工作就会丢给编译器做,然后将结果合并在一起,进而完成整个编译工作。
5.include
include是包含的意思,这个单词和#合在一起,构成了一个编译指令。这个指令的意义就是要指定被包含的文件。#include后面跟着一个路径的文件就是要被预处理器包含到当前代码里来的。
6.内容替换
#include <iostream>是要将iostream文件包含到当前文件里来。那么iostream文件的内容是如何包含到当前文件里来的呢?我们在写好当前这个文件的代码后,是将当前文件提交给编译器编译的,我们是无法修改代码内容了的。预处理器将内容包含到当前文件里来,也就是在预处理器里完成的替换。
#include <iostream>在源代码文件里如main.cpp,起到一个指示预处理的作用和占位的作用。占位的意思就是,告诉预处理器读取iostream文件,并将此文件的内容替换掉#include <iostream>。最后,main.cpp文件的内容里,是没有#include <iostream>的。这样就完成了内容替换,完成了预处理的工作。然后再进行最终的编译工作。