Visual Studio 2010,Intellisense和PCH:丑陋的stdafx.h有哪些替代方案?

时间:2011-05-07 19:01:32

标签: c++ visual-studio visual-c++ precompiled-headers

我最近切换到Visual Studio 2010和Intellisense在使用boost库时不显示半分钟,Microsoft's suggestion似乎使用预编译头。

除了之前我从未使用过它们(除非被Ugly ATL Wizards(TM)强迫),所以我四处寻找它们是如何工作的。

基本上,大集中stdafx.h方法似乎是完全错误的。我从不想在所有来源中包含(甚至便宜)一大堆头文件。由于我不使用Windows库(我使用C ++ / CLI更高级别的包装器,然后使用.NET与外界交谈),我没有“一整套不变的巨大标头”。只需boost和标准库标题。

这个问题有an interesting approach,但我无法弄清楚如何使这项工作。似乎每个源文件必须编译两次(如果我错了,请纠正我):一次使用/ Yc,一次使用/ Yu。这增加了开发人员的负担,必须手动调整构建系统。

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

我可以在每个源文件的基础上使用预编译头文件有哪些选项?我并不关心构建时间(只要它们不会飙升),我只是希望intellisense能够快速

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:5)

你的问题基本上似乎是在VS2010中Intellisense的Boost速度很慢?我没有这个问题的直接解决方案,但Visual Assist X可以选择吗?我现在在各种版本的Visual Studio中使用它并且非常愉快。不是直接的解决方案,但它可能适合您。

答案 2 :(得分:4)

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

不要将它们用作正确和精确的#includes的替代品,而是作为一种加快速度的方法。通过使预编译的头在发布版本中不执行任何操作来实现此目的,只是在调试中加快速度。

答案 3 :(得分:3)

你错了,每个文件只编译一次。你有一个用/ Yc编译的.cpp文件,其余的是用/ Yu编译的.cpp文件。带/ Yc的文件,默认为stdafx.cpp,包含一行#include“myMainHeader.h”(更改默认名称)所有其他.cpp文件必须以#include“myMainHeader.h”开头。编译/ yc文件,保存编译器的整个内部状态。编译每个其他文件时会加载该文件。这就是为什么你必须从包含PCH开始,以便/ Yu选项不会改变编译结果,只改变时间。 Xcode没有提出此要求,并且无论您的.cpp文件是否以正确的include指令开头,都将使用PCH。我使用了依赖于它的库,如果没有PCH就无法构建。