为什么stdafx.h的工作方式是这样的?

11

像往常一样,当我无法自己解决问题时,我来向你们寻求帮助 :)

这一次我一直在思考stdafx.h为什么会起作用?据我所知,它有两个作用:

  • 包含标准头文件,我们可能(?)使用并且很少更改。
  • 在代码不再预编译时作为编译器的书签。

现在,对我来说,这两件事似乎是两个非常不同的任务,我想知道为什么他们没有采取两个单独的步骤来处理它们?对我来说,让#pragma命令执行书签任务并选择性地使用类似于windows.h的头文件来包含经常使用的头文件似乎是合理的...这也引出了我的下一个问题:为什么我们被迫通过stdafx.h包括经常使用的头文件?就个人而言,我不知道有任何我使用的经常使用的头文件,我已经为其进行了自己的包含 - 但也许这些头文件对于.dll生成是必需的吗?

提前感谢

4个回答

6
stdafx.h是Visual Studio使用预编译头文件的一种方式。它是一种简单易用、易于自动生成的方法,适用于较小的应用程序,但对于更大更复杂的应用程序可能会导致问题,因为它有效地鼓励使用单个头文件,这可能会导致本来独立的组件之间出现耦合。如果仅用于系统头文件,它往往还可以接受,但随着项目规模和复杂性的增长,很容易将其他头文件放入其中,然后任何头文件的更改都会导致重新编译整个项目。
有关另一种方法的详细信息,请参见此处:是否有一种方法可以在VC++中使用预编译头文件而不需要stdafx.h?

4
你不必强制使用"stdafx.h"。你可以在项目属性(或创建项目时)中取消选中“使用预编译头文件”,这样就不再需要stdafx.h了。
编译器将其用作提示,以便能够单独预编译最常用的头文件到一个.pch文件中,以减少编译时间(不必每次都编译)。

抱歉 Mehrdad,我重新阅读了你的问题和答案,同意你的观点,我在你发表评论之前已将我的评论删除了。如果您编辑您的答案,我将非常乐意为您投票(它显示我的投票太旧,需要您编辑回复才能更改我的投票)。 - BlueTrin

1

它可以减少编译时间,因为其中的内容总是首先被编译(请参见以下引用中的详细信息):

stdafx.h 是一个文件,描述了标准系统和项目特定的包含文件,这些文件经常使用但很少更改。

兼容的编译器将预编译此文件以减少总体编译时间。 Visual C++ 不会在源文件中的 #include "stdafx.h" 之前编译任何内容,除非未选中编译选项 /Yu'stdafx.h'(默认情况下);它假定源代码中包括该行在内的所有代码已经编译完成。


1
我不确定除了第一个发帖者之外,有没有人正确阅读了这个问题。 - BlueTrin

-5

这将有助于减少长时间的编译。


1
回答问题前请先阅读问题。 - BlueTrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接