一个C++程序一般需要经过以下几个步骤才能成为可执行程序:
那么,在以上的每一步中,编译器到底做了哪些工作呢?
一、编译器预处理
C++编译器自带预处理器,在程序编译之前,由预处理器对C++源程序完成预处理工作。
预处理主要将源程序中的宏定义指令、条件编译指令、头文件包含指令以及特殊符号完成相应的替换工作。
预处理指令#include用于包含头文件,有两种形式:#include <xxx.h>,#include "xxx.h"。
尖括号形式表示被包含的文件在系统目录中。如果被包含的文件不一定在系统目录中,应该用双引号形式。
在双引号形式中可以指出文件路径和文件名。如果在双引号中没有给出绝对路径,
则默认为用户当前目录中的文件,此时系统首先在用户当前目录中寻找要包含的文件,
若找不到再在系统目录中查找。对于用户自己编写的头文件,宜用双引号形式。
对于系统提供的头文件,既可以用尖括号形式,也可以用双引号形式,
都能找到被包含的文件,但显然用尖括号形式更直截了当,效率更高。
./表示当前目录,../表示当前目录的父目录。
stdafx.h
在VS中新建一个WIN32工程时,编译器一般默认会在主程序中添加一条#include"stdafs.h"语句。
而stdafx.h只包含如下几行引用头文件的代码:
<span style="font-size:18px;">// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// TODO: 在此处引用程序需要的其他头文件
</span>
而在stdafx.cpp中,仅有一条语