C++ VisualStudio2010,Intellisense和PCH:丑陋的stdafx.h有哪些替代方案?

C++ VisualStudio2010,Intellisense和PCH:丑陋的stdafx.h有哪些替代方案?,c++,visual-studio,visual-c++,precompiled-headers,C++,Visual Studio,Visual C++,Precompiled Headers,我最近切换到VisualStudio2010,为了让Intellisense在使用boost库时不花半分钟就显示出来,我似乎使用了预编译的头文件 除了我以前从未使用过它们(除非是被丑陋的ATL向导(TM)强迫使用),所以我四处搜索以了解它们是如何工作的 基本上,大型集中式stdafx.h方法似乎完全错误。我从来都不想在我所有的源代码中包含(甚至很便宜)一大堆头文件。由于我不使用windows库(我制作C++/CLI更高级的包装,然后使用.NET与外界交流),所以我没有“一整车不改变的巨大头”。只

我最近切换到VisualStudio2010,为了让Intellisense在使用
boost
库时不花半分钟就显示出来,我似乎使用了预编译的头文件

除了我以前从未使用过它们(除非是被丑陋的ATL向导(TM)强迫使用),所以我四处搜索以了解它们是如何工作的

基本上,大型集中式
stdafx.h
方法似乎完全错误。我从来都不想在我所有的源代码中包含(甚至很便宜)一大堆头文件。由于我不使用windows库(我制作C++/CLI更高级的包装,然后使用.NET与外界交流),所以我没有“一整车不改变的巨大头”。只需
boost
和标准库标题就可以了

这个问题是有道理的,但我不太明白如何解决这个问题。似乎每个源文件必须编译两次(如果我错了,请纠正我):一次使用/Yc,一次使用/Yu。这增加了开发人员的负担,开发人员必须手动调整构建系统

我希望能找到一些“为每个源文件自动生成一个预编译头”的技巧,或者至少是一些“最佳实践”,但大多数人似乎都很乐意将世界纳入
stdafx.h


在每个源文件的基础上,我可以使用哪些选项来使用预编译头?我真的不关心构建时间(只要它们不会急剧上升),我只希望intellisense能够快速工作如果你错了,每个文件只编译一次。有一个.cpp文件是用/Yc编译的,其余的是用/Yu编译的。带有/Yc的文件(默认情况下为stdafx.cpp)包含一行“include”myMainHeader.h”(更改了默认名称)。所有其他.cpp文件都必须以“include”myMainHeader.h开头。编译/Yc文件时,编译器的整个内部状态都会保存。当编译每个其他文件时,将加载该文件。这就是为什么您必须从包含PCH开始,以便/Yu选项不会更改编译结果,只更改时间。Xcode不作此要求,无论.cpp文件是否以right include指令开头,它都将使用PCH。我使用的库依赖于此,没有PCH就无法构建。

如果正确使用预编译头,也不会太糟糕


不要用它们来代替适当和精确的包含,而是作为一种加速事情的方式。通过使预编译头在发布版本中不做任何事情来实现这一点,只是在调试中加快了速度。

对于初学者来说,您读错了文章。不是每个文件都编译两次。文件stdafx.cpp首先使用/Yc(c,用于create)编译一次,然后项目中的其他每个文件使用/Yu(u,用于use)编译一次,并从stdafx.cpp导入先前创建的保存状态的结果


其次,这篇文章已经有7年的历史了,它讨论的是VC++6,所以你应该从不信任它开始。但即使假设其中的信息仍然适用于VC++2008或2010,这似乎是一个糟糕的建议。它建议使用
/pragma hdrstop
的方法是寻找问题的解决方案。如果您的头文件包含您不希望在每个文件中包含的内容,那么它们就不应该放在预编译的头文件中

您的问题基本上似乎是Intellisense在VS2010中的提升速度较慢?我没有这个问题的直接解决方案,但你可以选择吗?我现在已经在各种版本的VisualStudio中使用了它,并且非常高兴。这不是一个直接的解决方案,但可能对你有用

这是个好问题。我通常会放弃PCH,转而与ccache一起使用mingw gcc。对于C++来说,智能化总是快得多;在VS2010中,它只是比以前差了一点。至于预编译的头文件,与系统抗争比它的价值更麻烦;只是顺其自然。只是一个问题:你的问题基本上是Intellisense在VS2010中的推进速度慢?视觉辅助X能成为你的选择吗?@Bart:为什么不能。我来主持审判。我希望有一些“内置”的解决方案。它是否也为C++/CLI提供Intellisense(这将是一个加号)?@Alexandre:我没有内置的解决方案,所以我只是对它发表了评论。关于C++/CLI,我真的不知道,但我想应该是这样。祝你好运希望这对您有用。@Alexandre链接的文章谈到使用/FI选项或#pragma hdrstop,而不是在每个文件中使用#include指令。出于兼容性的考虑,我不建议这样做。好吧,很抱歉有点苛刻,但我似乎不理解实际生成PCH需要一个额外的文件这一事实。现在我明白了,那个家伙的解决方案对我来说似乎很糟糕:它在构建发布产品时被激活,在调试时被停用。如果我没有看错你的最后一句话,我根本不应该使用预编译头。对于创建符号的头,不应该使用预编译头,因为这些符号会在任何地方暴露。相反,它们用于安全且自包含的标题,如boost和stl,或者用于实际上需要在任何地方包括的内容,如windows.h。这似乎是合理的。这也意味着,除非在几乎所有源文件中都有大量的大标题(这是我极力避免的),否则不应该使用它们。值得注意的是,视觉辅助不会显著改善boost的自动完成功能,因为boost是一个相当复杂的库,自动完成工具似乎不能很好地与之配合。然而,视觉辅助是一个很棒的工具,我无法想象没有它也能工作,所以你无论如何都应该看看它。除此之外,我似乎无法理解两者之间的联系