我目前正在为我的C ++项目使用Visual Sstudio 2010和Eclipse + MinGW。我经历过不同的编译器行为,需要您的解释。这是一个例子:
假设我有a.h
和a.cpp
。我有预编译的头文件(即VS中的stdafx.h
和Eclipse中的precomp.h
(我为Eclipse创建了一个))。我将在预编译的头文件中包含一些基本头文件(例如,opencv中的core.hpp)。在a.h
和a.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对我的不同行为?非常感谢。
答案 0 :(得分:0)
预编译标头是一种效率衡量标准。如果编译器使用常规方法编译它们,代码应该仍然有效。特别是,您的Visual C ++代码应该在Eclipse上编译,反之亦然。
我强烈怀疑你的问题是在Eclipse方面。为什么 a.cpp
几乎是空的?它应包含a.h
中所有声明的定义。
如果你包含“precomp.h”,它可能应该出现在“a.h”的内容之前。实现这一点基本上有两种方法。一种是按顺序包含两个标题(Visual Studio样式),另一种是在“a.h”中的任何声明之前包含“precomp.h”。 (MinGW风格)
预编译的规则在MinGW中稍微放松一些,因为它预编译较少。那个