C++ 关于Visual C++;

C++ 关于Visual C++;,c++,visual-studio,precompiled-headers,stdafx.h,C++,Visual Studio,Precompiled Headers,Stdafx.h,如果我将一个头(a.h)放入stdafx.h中,并且该头包含stdafx.h中未提及的另一个头(b.h),那么每次有人包含a.h时,是否都会访问b.h,或者是否将其编译为a.h的一部分?如果它被编译成a.h,当某人直接包含b.h时会发生什么?这是否会被预编译 我问这个问题的动机是,我试图为我所使用的软件优化stdafx.h文件的内容。重建和增量构建时间对我们都很重要。我想知道是否可以在所有.cpp文件中搜索#include指令并计算每个文件被包含的次数。经常包含的文件可能是stdafx.h文件的

如果我将一个头(a.h)放入stdafx.h中,并且该头包含stdafx.h中未提及的另一个头(b.h),那么每次有人包含a.h时,是否都会访问b.h,或者是否将其编译为a.h的一部分?如果它被编译成a.h,当某人直接包含b.h时会发生什么?这是否会被预编译

我问这个问题的动机是,我试图为我所使用的软件优化stdafx.h文件的内容。重建和增量构建时间对我们都很重要。我想知道是否可以在所有.cpp文件中搜索#include指令并计算每个文件被包含的次数。经常包含的文件可能是stdafx.h文件的良好候选文件。当然,这个策略完全是假的,如果我不仅要考虑哪些文件被包含,而且哪些文件包含的文件包括。
我怀疑这是否重要,但我们正在使用Visual Studio 2005。

a.h和b.h将是预编译头的一部分,以后不需要包含它们。您只需在需要a.h或b.h的地方包含stdafx.h。如果在stdafx.h之后显式包含a.h或b.h(忽略stdafx.h include之前的所有代码),则不会再次编译该文件(因为它们通常受
#pragma once
指令或定义的保护),但如果您询问,编译器将在硬盘上打开该文件


顺便说一句,您应该知道,您可以使用几个预编译的头文件(但每个cpp文件中不能超过一个)。

您所说的在stdafx.h之后包含a.h或b.h在技术上是正确的——编译器将再次查看头文件——但大多数头文件使用#pragma一次或包含保护以防止这种情况发生。事实上,我建议将a.h和b.h包含在任何需要的地方,即使a.h在stdafx.h中——否则,您将无法在以后调整stdafx.h的内容,而不会遇到无休止的编译错误列表。是的,它们不会被编译,但在技术上会由编译器打开。我同意Nick的想法很有帮助,但我只是担心性能会受到影响,因为我们需要进行额外的磁盘IO,以发现有一个#progma onceprece投票支持这一点: