33

我看到了很多代码,包括 stdafx.h。说,我想要预编译的头文件。我自己手动包含所有必需的系统标头。在那种情况下,我应该知道我需要在哪里有其他充分的理由stdafx.h吗?

4

6 回答 6

17

如果您不想使用预编译的头文件,那么使用标准的包含文件是没有意义的——这将减慢包含它的每个文件的构建速度,并导致它们包含他们不需要的额外内容。摆脱它,只包含他们需要的标题。

于 2009-03-24T07:13:43.630 回答
3

stdafx.h只是另一个头文件。如果您觉得不需要它,请随意不包含它并将其从项目中删除。

然而,有一个像 stdafx.h 这样的文件是非常典型的,它完全可以让预编译的头文件正常工作,而不是在每个源文件中手动包含所有的东西。

于 2009-03-24T07:09:18.650 回答
3

您可以使用预编译的头文件(这是一件好事)而不使用 stdafx.h(我也讨厌它)。我只能访问 VC++ 6.0,但在其中转到项目设置|C/C++|预编译头文件并选择“自动使用预编译头文件”,但将“编译通过”框留空。

于 2009-03-24T09:49:39.980 回答
2

即使没有预编译的头文件,stdafx.h 也很方便,因为它将头文件包含和所有文件通用的定义分组。

您当然可以选择在每个文件中重复所有这些定义。stdafx.h 不是绝对必要的。

于 2009-03-24T07:08:39.087 回答
1

正如其他人所提到的:如果您不需要预编译的标头,那么您实际上并不需要 stdafx.h 。实际上,仅使用它来对常见的包含进行分组是非常糟糕的做法。

事实上,即使在使用预编译头文件时,最好在 stdafx.h(或 precompiled.h 或您想调用的任何名称)之后包含您的进程实际需要的头文件 - 以及在您的预编译头文件中关闭 #ifdef 魔法PCH的使用。

为什么?为了检查您的模块依赖关系。能够禁用 PCH 可以让您了解是否包含必要的模块,然后您可以编写一个工具来通过解析 .cpp 和 .h 文件(当然不包括 PCH 标头)来检查模块的相互依赖性。

于 2009-03-24T07:43:13.700 回答
0

我知道这是一个老话题,但我想我会把我的意见传递给读者。我在 2017 年发现了这个,所以我确定我不是唯一一个会在这里的人。

使用预编译的头文件有一个优势,其他人可能会忽略这一点,因为他们多年来一直在使用他们的做法。C++ 标准已经有了很大的发展。不是在您可能需要的 20 个文件中包含向量和或其他文件,而是使用 PCH 文件,编译器必须做更少的工作,这让每个人都开心。您也可以将常用的宏放在那里,例如 VERIFY、ASSERT 和智能类对象。不要把你的类头放在那里,这没有意义,而是标准库或者你需要在很多地方全局使用的东西,比如我提到的宏。

basically realize this, by including the headers you need in every file you need, such as iostream, string, and vector, you are effectively compiling that every single time as an inline to the file. Include a "Pre Compiled" header, well just the name should ring a bell there.

于 2017-03-08T23:29:13.600 回答