18

boost我最近切换到 Visual Studio 2010 并且 Intellisense 在使用库时不会花半分钟时间显示出来,微软的建议似乎是使用预编译的头文件。

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

基本上,大中心stdafx.h化方法似乎完全错误。我从不想在我的所有源代码中包含(甚至便宜)一大堆头文件。因为我不使用 Windows 库(我制作 C++/CLI 更高级别的包装器,然后使用 .NET 与外界对话),所以我没有“一大堆不变的巨大标题”。只是boost和标准库头文件散落一地。

一种有趣的方法可以解决这个问题,但我不太清楚如何完成这项工作。似乎每个源文件都必须编译两次(如果我错了请纠正我):一次使用 /Yc,一次使用 /Yu。这增加了必须手动调整构建系统的开发人员的负担。

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

在每个源文件的基础上,我可以使用哪些选项来使用预编译的头文件?我并不真正关心构建时间(只要它们不飙升),我只希望智能感知能够快速工作。

4

4 回答 4

9

对于初学者来说,你读错了这篇文章。每个文件都不会编译两次。文件 stdafx.cpp 使用 /Yc (c,用于创建)在其他任何内容之前编译一次,然后项目中的每个其他文件都使用 /Yu (u,用于使用)编译一次,并导入先前创建的保存状态的结果来自 stdafx.cpp。

其次,这篇文章已有 7 年历史,并且正在谈论 VC++ 6,因此您应该开始不信任它。但即使假设其中的信息仍然适用于 VC++ 2008 或 2010,这似乎是个坏建议。它推荐使用的方法/pragma hdrstop是寻找问题的解决方案。如果您的头文件中包含您不希望在每个文件中包含的内容,那么它们根本不应该出现在您的预编译头文件中。

于 2011-05-07T22:26:24.963 回答
5

您的问题基本上似乎是 VS2010 中的 Boost 的 Intellisense 速度慢?对于这个问题,我没有直接的解决方案,但Visual Assist X可以成为您的选择吗?我现在非常高兴地在各种版本的 Visual Studio 中使用了它。不是直接的解决方案,但它可能对您有用。

于 2011-05-08T14:46:58.647 回答
4

如果使用得当,预编译的头文件也不会太糟糕。

不要将它们用作正确且精确的#includes 的替代品,而是作为加快处理速度的一种方式。通过使预编译的头文件在发布版本中不做任何事情来实现这一点,只在调试中加快速度。

于 2011-05-07T21:17:16.940 回答
3

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

于 2011-05-07T21:14:55.907 回答