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.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"

此外,我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 中的预编译头文件的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 2010怎么新建c语言文件

visual studio 2010编译c的设置方法

microsoft visual studio创建button背景颜色代码

visual studio code 怎么运行c语言

visual studio C/C++ 编程学习 visual studio 中的生成事件

哪些C语言函数在visual studio2015报错并怎么修改