面试题答案
一键面试预编译提升重新编译效率的原理
- 减少重复编译:在C++项目中,许多源文件可能包含相同的头文件。预编译将头文件内容预先处理一次,并生成预编译头文件(
.pch
文件)。当源文件重新编译时,若头文件未改变,编译器无需再次处理头文件中的代码,直接引用预编译头文件,减少了重复编译头文件中代码的开销。例如,多个源文件都包含<iostream>
头文件,预编译后,重新编译源文件时无需再次解析<iostream>
的内容。 - 语法分析缓存:预编译头文件缓存了头文件中代码的语法分析结果。在重新编译源文件时,编译器可以更快地理解代码结构,因为无需重新进行复杂的语法分析,提升了编译速度。
预编译头文件的设置和使用方法
- 设置:
- Visual Studio:
- 打开项目属性,在“C/C++” -> “预编译头”中进行设置。选择“创建/使用预编译头”,并指定预编译头文件的名称(如
stdafx.pch
)和源文件(如stdafx.cpp
)。在stdafx.cpp
文件中包含项目中常用且不频繁变动的头文件,如<iostream>
、<vector>
等。
- 打开项目属性,在“C/C++” -> “预编译头”中进行设置。选择“创建/使用预编译头”,并指定预编译头文件的名称(如
- GCC:
- 使用
-Winvalid-pch
等相关编译选项。首先,使用g++ -c -o stdafx.pch -x c++-header stdafx.h
命令生成预编译头文件stdafx.pch
,其中stdafx.h
包含常用头文件。然后在编译源文件时,使用g++ -include stdafx.pch source.cpp -o executable
命令,使源文件source.cpp
使用预编译头文件。
- 使用
- Visual Studio:
- 使用:
- 在源文件中,应将包含预编译头文件的
#include
语句放在文件开头。例如,若预编译头文件为stdafx.pch
对应的头文件是stdafx.h
,则在源文件开头添加#include "stdafx.h"
。这样,编译器在编译源文件时,首先会加载预编译头文件,利用其中缓存的信息,提高编译效率。同时,确保在预编译头文件对应的源文件(如stdafx.cpp
)中只包含稳定不变或很少变动的头文件,避免因头文件频繁变动导致预编译头文件失效,从而失去提升编译效率的作用。
- 在源文件中,应将包含预编译头文件的