C:Visual Studio和Eclipse + MinGW中的预编译头文件

时间:2012-08-27 06:12:45

标签: c++ visual-studio-2010 mingw

我目前正在为我的C ++项目使用Visual Sstudio 2010和Eclipse + MinGW。我经历过不同的编译器行为,需要您的解释。这是一个例子:

假设我有a.ha.cpp。我有预编译的头文件(即VS中的stdafx.h和Eclipse中的precomp.h(我为Eclipse创建了一个))。我将在预编译的头文件中包含一些基本头文件(例如,opencv中的core.hpp)。在a.ha.cpp中,我将使用在预编译头文件中包含的基本头文件中声明的一些类(例如,opencv中的Mat)。

对于Visual Studio 2010,我必须将stdafx.h放在每个.cpp文件中(如link中所示)。所以在a.cpp中,我在开头就有了这个:

#include "stdafx.h"
#include "a.h"

此外,我 stdafx.h中包含a.h。我期待编译器找不到基本头文件中声明的类的错误,但事实证明编译在VS下很好。根本没有错误。

对于Eclipse + MinGW,我喜欢这样:在a.h中,我将#include "precomp.h"放在开头。在a.cpp中,我放置#include "a.h"正如一些朋友所说,这是包含头文件的C ++标准方式)。编译后,这不是错误,这是毫无疑问的。但是,如果我按照我对Visual Studio所做的那样做,即我precomp.h中包含a.h。将出现错误,表明在此范围内未声明某些类。 As concerned by @MSalters, I should **highlight** that both a.h and a.cpp contain proper declarations and definitions.

所以任何人都可以帮助解释VS和Eclipse + MinGW对我的不同行为?非常感谢。

1 个答案:

答案 0 :(得分:0)

预编译标头是一种效率衡量标准。如果编译器使用常规方法编译它们,代码应该仍然有效。特别是,您的Visual C ++代码应该在Eclipse上编译,反之亦然。

我强烈怀疑你的问题是在Eclipse方面。为什么a.cpp几乎是空的?它应包含a.h中所有声明的定义。

如果你包含“precomp.h”,它可能应该出现在“a.h”的内容之前。实现这一点基本上有两种方法。一种是按顺序包含两个标题(Visual Studio样式),另一种是在“a.h”中的任何声明之前包含“precomp.h”。 (MinGW风格)

预编译的规则在MinGW中稍微放松一些,因为它预编译较少。那个