2012-07-09 99 views
11

我今天第一次遇到了预编译头文件..改变了我的生活。我无法相信编译我的C++代码可能会很快。这使得现在总感觉..头文件中的预编译头文件

无论如何,有一点是困惑我的是,从我至今读,预编译头只应加入源文件(CPP?)。

在Visual Studio中,有项目属性 - > C/C++下的选项 - >高级 “人力包含文件”。我将该编译器选项设置为stdafx.h

做this..I不再需要包括我已经加入到我的stdafx.h中头之后,即使是在我的头文件(源文件都应该自动包括stdafx.h中)。这是预期的行为?

我无法找到一个地方,在头/源文件之间的区别清楚。

如果does..great但恐怕它的那些东西VC++让你得逞的,但将在GCC打破一个又一个。是的,它需要可移植;至少在GCC和VC++之间。

+1

那么,如果你想让你的项目在gcc上工作,那么你最好远离“强制包含文件”选项。 Boilerplate是使源代码文件中的第一个#include包含预编译头文件。 – 2012-07-09 21:15:51

+2

@Hans,等效的gcc功能是使用'-include'命令行选项在每个文件的开头包含* stdafx.h *。 – 2012-07-09 21:21:48

回答

13

的StdAfx.h真的应该只包含在源文件,而不是头。我建议你在每个cpp中首先#include“StdAfx.h”,不要使用“强制包含文件”选项。多数民众赞成我的跨平台项目。为了记录,我实际上并没有在GCC中使用预编译头文件,我只是通常构建它,并且它运行良好。

对于一些背景。编译器仅查看源文件(即* .cpp,* .c等),因此编译它们时必须包含每个头文件并编译头文件中的任何代码。预编译头文件选项允许一次性编译所有代码(即全局包含在StdAfx.h中的代码),这样您就不必一直这样做。那就是StdAfx.cpp的用途。编译器用StdAfx.h中包含的所有代码编译StdAfx.cpp,而不是每次构建时都要这样做。

因此,由于您将StdAfx.h作为第一项包含在每个源文件中,因此将它包含在任何头文件中是没有意义的,因为它们将包含在StdAfx.h之后,因此将有权访问StdAfx.h中的所有代码。另外,你可以在其他项目中使用这些头文件,而不必担心有一个StdAfx.h或包含错误的头文件。

+0

我的问题是VC++自动将这些添加到标题?使用我没有包含的类型时(但是在stdafx.h中),我没有遇到任何错误......非常奇怪。 – irwinb 2012-07-11 04:09:02

+2

不,强制include选项将文件添加到每个源/ cpp文件的第一行。工作方式包括将要包含的文件的内容放入源文件中#include的位置。使用force include选项可使每个CPP文件的顶部都包含StdAfx.h的内容,随后是所有头文件和源代码的内容(无论文件中的顺序如何)。所以效果是,StdAfx.h中定义的所有内容都将在您的头文件中提供,在该项目中。编译器只查看源文件而不是头文件。 – syplex 2012-07-13 21:30:18

+0

哦,我明白了。这很有道理。谢谢你的解释。 – irwinb 2012-07-19 18:19:13

4

是的,这是预期的行为。项目属性 - > C/C++ - >高级“人力包含文件”设置控制Visual C++ compiler option /FI

该选项的指定用双 引号在文件中的#include指令在第一相同的效果每行 源文件

因此,它可以让您免于包括stdafx.h手动。

尽管可以在GCC和其他编译器中使用预编译头文件 Visual C++的快捷行为在其他编译器中不可移植。因此,请查看How to handle stdafx.h in cross-platform code?讨论便携式解决方案的想法。您可以在您的.cpp源文件中手动添加stdafx.h,并且您也可以使用GCC(假设您将为GCC配置您的版本以使用预编译头文件)。

+0

广告到.h和.cpp文件? – irwinb 2012-07-09 21:40:42

+0

@irwinb到.cpp文件。答案也已更新。 – mloskot 2012-07-09 22:18:32

+0

如果它只添加到.cpp文件,为什么VC++可以在我的头文件中减少这些类型而不包含它们? – irwinb 2012-07-10 16:21:13

2

不要使用“强制包含文件”设置(/ FI),因为它会中断编辑&继续! (和MS似乎并不想解决这个问题)

https://connect.microsoft.com/VisualStudio/feedback/details/668339/vs-2010-sp1-c-edit-and-continue-fails-with-fi

https://connect.microsoft.com/VisualStudio/feedback/details/342441/visual-studio-2005-force-includes-breaks-edit-and-continue-with-pre-compiled-headers

#include "stdafx.h"只能作为发现在源文件中的第一个非注释行,不在头文件中。