C++预编译头文件

一、
在实际项目开发中,当代码量以及文件数量达到一定规模时,编译项目往往需要耗费比较长的时间。此时我们可以为一些配置或者逻辑引入一些脚本(游戏开发中通常为lua);同时我们可以在工程中使用预编译头文件,即工程中总有那么一堆头文件是几乎所有cpp都必须包含的,而且这些头文件中的代码是不会经常改变的。使用预编译头我们便可以将这些头文件只编译一次,然后可供其他所有cpp使用。
二、
我们都知道stdafx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的头文件。其实这是一个预编译头文件。这是MFC工程建立的默认预编译头。包含以下内容:

#include <afxwin.h>
#include <afxext.h>
#include <afxdisp.h>
#include <afxdtctl.h>
#include <afxcmn.h>


stdafx.cpp 中的内容:
#include "stdafx.h"

这些正是使用MFC所必须包含的头文件,当然我们不太可能在我们工程中修改这些头文件,所以说是稳定和不会变动的

三、
自己在实际项目开发中使用预编译头
比如:Uploader.h 包含了大量工程中用到的自定义头文件以及库文件

#ifndef __UPLOADER_PCH__
#define __UPLOADER_PCH__

#include "Engine.h"
#include "Engine/KG_Time.h"
#include "Engine/KGLog.h"
#include "FileSystem/IFileSystem.h"
#include "Conf/IConf.h"
#include "FileSystem/LooseFileSystem.h"
#include "libs3sdk.h"

#include <fstream>
#include <iostream>
#include <mutex>
#include <sstream>
#include <stdio.h>
#include <string>
#include <thread>
#include <vector>

#endif

Uoloader.cpp

#include "Uploader.h"

然后在Uploader.cpp属性中设置预编译头

关键字:预编译,/Yu,/Yc,/Yx
右键cpp–>属性–>C/C++–>预编译头–>使用预编译头

设置好项目属性后,编译连接会在我们项目中生成.pch后缀的文件,默认为项目名。生成预编译头通常是比较耗时的,而且预编译头文件(.pch)文件通常很大,10多MB,故及时清理那些不经常使用的预编译头。

使用预编译头技术后,虽然为编译带来了极大的方便,但也造成了一个问题:由于它假定预编译头中所包含过的头文件会在所有的cpp中使用。因此编译器在编译cpp的时候,就会将预编译头中已经编译好的部分加载到内存中。所以我们的cpp必须包含预编译头,即将预编译头文件Uploader.h放到每一个cpp的开头。这样编译器才能将.pch从内存中请出去,服务于我们具体的cpp.

本文只讲述原理,预编译头细节使用请参考相关资料~

猜你喜欢

转载自blog.csdn.net/gaoyz1/article/details/80031810