Visual Studio 2017会不必要地重新编译stdafx.h吗?

时间:2017-11-03 16:05:43

标签: c++ visual-studio visual-studio-2017 precompiled-headers

我有一个Visual Studio 2017 C ++项目,该项目使用预编译头文件(stdafx.h)。

我的(简化)文件结构如下:

header1.hpp
header2.hpp
stdafx.h -> includes header1.hpp
code1.cpp -> includes stdafx.h
code2.cpp -> includes stdafx.h and header2.hpp

为了避免含糊不清,请说includes header1.hpp,我的意思是文件中有一行#include <header1.hpp>

  1. 修改stdafx.h后,所有三个文件stdafx.hcode1.cppcode2.cpp都会重新编译(按预期方式)。

  2. 修改code1.cpp后,只会重新编译code1.cpp(按预期方式)。

  3. 修改header2.cpp后,重新编译了所有三个文件stdafx.hcode1.cppcode2.cpp不期望!)。

  4. 我原本期望第3项只编译code2.cpp,而不是其他所有内容。

    此行为的一个可能原因是构建管理器无法检查并遵循#include指令,因此如果修改了任何头文件,它只会重新编译所有内容。

    由于我的项目非常庞大,重新编译code1.cpp等所有文件会占用大量时间。我故意不包括header2.hpp中的stdafx.h,因为我知道我会经常修改header2.hpp,只有code2.cpp需要使用它。 (header2.hpp是一个模板库,只有code2.cpp个需要的功能。)

    是否需要此行为,以及如何让Visual Studio识别其他文件无需重新编译?

1 个答案:

答案 0 :(得分:0)

原来我在一年前禁用了预编译的标题(但在项目中留下了stdafx.hstdafx.cpp),当我想再次使用它们时,我忘了打开{{1} }和/Yc选项。

没有给出任何错误,Visual Studio一直在编译Yu,就像常规的.cpp文件一样。

另外,我对预编译头文件的工作方式有错误的想法。我认为stdafx.cpp自己编译编译(然后通过某些中间表示将其转储到stdafx.h的.cpp文件中),但实际上编译的文件是{{1} (并且在编译时会生成.pch文件)。 (根据this question。)

打开预编译标题选项后,当我修改#include "stdafx.h"时,只会{}重新编译stdafx.cpp

此外,编译时间现在明显加快。