关于Visual Studio的预编译头文件
使用Visual Studio很久了,关于这个细节今天终于算弄清楚了,记录一下。
使用Visual Studio或其他IDE学习C++时,即便是最简单的hello world的控制台程序,首先也要新建一个工程,而不能直接用记事本新建个后缀为cpp的文本文件,然后一条命令(比如cc)就完成了的,那么新建工程时就有下面3种类型:
1、默认状态下
这时候默认预编译头,生成的文件结构如下:
2、取消勾选Precompiled header
完成后文件结构与之前完全相同,文件内容也相同,那么这两种类型到底有什么区别呢?
不同点在于第二种状态下,stdafx.h和stdafx.cpp是可以删除的(当然会提示类型未定义,因为删掉了#include <tchar.h>,把main函数头改为int main()即可)。默认状态下则不能删除,连接时报错。
继续深究的话,其根本原因在于这个:勾选Precompiled header时编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。
基于这一点,默认状态下,我们在#include "stdafx. h"前使用#include <iostream>不会生效,而第二种情况则可以生效。实际上就是两种状态下编译器对#include "stdafx. h"执行不同的操作。默认状态下预先编译stdafx. h里的内容,并生成pch文件,跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。而取消勾选则与自己编写的头文件作用相同,仅仅是将stdafx. h头文件包含进来,不进行预编译。
3、最后一种就是勾选空工程了,这种就不再赘诉,直接在Source Files目录下新增自己的cpp文件,Header Files目录下新增自己的头文件即可。