2.1 语言的翻译过程
翻译器分为两类:解释器和编译器。
2.1.1 解释器
解释器将源代码转化成一些动作(它可由多组机器指令组成)并立即执行这些动作。
对于解释器,较好的交互性和适于快速程序开发(不必要求可执行程序)是常被提到的两个优点。
解释器必须驻留内存以执行程序。
2.2.2 编译器
编译器直接把源代码转化成汇编语言或机器指令。最终的结果是一个或多个机器代码的文件。
2.1.3 编译过程
编译过程的步骤首先要对源代码执行预处理。预处理器是一个简单的程序,它用程序员定义好的模式代替源代码中的模式。
编译一般分两遍进行。首先,对预处理过的代码进行语法分析。然后由代码生成器遍历语法分析树,把树的每个节点转化成汇编语言或机器代码。
2.1.3.1 静态类型检查
类型检查是编译器在第一遍中完成的。
静态类型检查是指类型检查是在编译阶段而不是程序运行阶段进行的。
动态类型检查是在程序运行时作部分类型检查。
2.2 分段编译工具
2.2.1 声明与定义
声明是向编译器介绍名字——标识符。它告诉编译器“这个函数或这个变量在某处可找到它的摸样像什么”。
定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存变量的数据。对于函数,编译器会生成代码,这些代码最终页要占用一定的内存。
在C++中,可以在不同的地方声明相同的变量和函数,但只能有一个定义。
2.2.1.1 函数声明的语法
C/C++的函数声明就是给函数取名、指定函数的参数类型和返回值。如:
Int func1(int, int);
2.2.1.2 一点说明
Int func1();
在C语言中,表示一个可带任意参数的函数;但在C++语言中,表示不带参数的函数。
2.2.1.3 函数的定义
函数定义看起来像函数声明,但它还有函数体。函数体是一个用大括号括起来的语句集。大括号表示这段代码的开始和结束。
Int func1(int length, int width){ }
注意:(1)在函数定义中,大括号代替了分号的作用,因此在函数体后不再使用分号;(2)如果要在函数体中使用参数的话,函数定义中的参数必须有名称。
2.2.1.4 变量声明的语法
函数声明包括函数类型(即返回值类型)、函数名、参数列表和一个分号。
变量声明需要使用关键字extern,它表示变量是在文件以外定义的,或在文件后面部分才定义。
在变量定义钱加extern关键字表示声明一个变量但不定义它,例如:
extern int a;
extern也可以用于函数声明,但不必要。
函数声明时参数标识符是可选的,函数定义时要求要求要有标识符(这里指C语言,而C++不要求)。
2.2.1.5 包含头文件
头文件是一个含有某个库的外部声明函数和变量的文件。
头文件由创建库的程序员提供。包含头文件需要使用#include预处理器命令。#include有两种方式来指定文件:尖括号(<>)或双引号(“”)。
#include<header>;
用尖括号来指定文件时,预处理器是以特定的方式来寻找文件,一般是环境中或编译器命令行指定的某种寻找路径。
#include“local.h”;
用双引号时,预处理器以“定义实现的途径”来寻找文件。它通常是从当前目录开始寻找,如果没有找到,那么include命令就按与尖括号同样的方式重新开始寻找。
2.2.1.6 标准C++include语句格式
标准使用的格式允许文件名长度可以大于众所周知的8个字符,去除了扩展名。例如:
#include <iostream.h>
现在可以写成:
#include <iostream>
从C继承下来的带有传统得到“.h”扩展名的库仍然可用,在使用时,去掉“.h”,在文件名前加一个字母“C”。即
#include <stdio.h>
#include <stdlib.h>
就变为:
#include <cstdio>
#include <cstdlib>