C : Visual Studio 和 Eclipse+MinGW 中的预编译头文件
Posted
技术标签:
【中文标题】C : Visual Studio 和 Eclipse+MinGW 中的预编译头文件【英文标题】:C : Pre-compiled header file in Visual Studio and Eclipse+MinGW 【发布时间】:2012-08-27 06:12:44 【问题描述】:我目前在我的 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"
此外,我不在a.h
中包含stdafx.h
。我期待编译器找不到基本头文件中声明的类的错误,但事实证明在VS下编译很好。完全没有错误。
对于 Eclipse+MinGW,我这样做:在a.h
中,我将#include "precomp.h"
放在开头。而在 a.cpp 中,我只放了#include "a.h"
(正如一些朋友所说,这是包含头文件的 C++ 标准方式)。编译后,这是没有错误的,这是毫无疑问的。但是,如果我像在 Visual Studio 中那样做,即我不在a.h
中包含precomp.h
。会有错误,说明有些类没有在这个范围内声明。 As concerned by @MSalters, I should **highlight** that both a.h and a.cpp contain proper declarations and definitions.
所以任何人都可以帮助向我解释 VS 和 Eclipse+MinGW 的不同行为吗?非常感谢。
【问题讨论】:
【参考方案1】:预编译的头文件是一种效率措施。如果编译器使用普通方法编译它们,则代码应该仍然有效。特别是,您的 Visual C++ 代码应该在 Eclipse 上编译,反之亦然。
我强烈怀疑您的问题出在 Eclipse 方面。为什么a.cpp
几乎是空的?它应该包含a.h
中所有声明的定义。
如果您包含“precomp.h”,它可能应该位于“a.h”的内容之前。基本上有两种方法可以实现这一目标。一种是以该顺序包含两个标题(Visual Studio 样式),另一种是在“a.h”中的任何声明之前包含“precomp.h”。 (MinGW 风格)
在 MinGW 中预编译的规则稍微宽松一些,因为它预编译的更少。那个
【讨论】:
对不起,我不是说a.cpp
中只包含头文件。定义在a.cpp
中。所以问题不在于这个。还有其他解释吗?谢谢!
@Giantron:当然可以,但是您最好尝试一个非常简单的设置,以便在仍然失败时显示所有代码。
我发现了问题.. 对不起,我没有太注意正确放置using namespace ...;
问题是由于放错了那个。你能建议把using namespace ...;
放在哪里最好吗?我应该总是把它放在头文件或源文件中吗?非常感谢。
@Giantron:这很简单。总是在源文件中。
我明白了。非常感谢,@MSalters以上是关于C : Visual Studio 和 Eclipse+MinGW 中的预编译头文件的主要内容,如果未能解决你的问题,请参考以下文章
microsoft visual studio创建button背景颜色代码