【问题标题】:stdafx.h: When do I need it?stdafx.h:我什么时候需要它?
【发布时间】:2010-10-15 03:39:31
【问题描述】:

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

【问题讨论】:

  • (适用于将其用作参考的任何人)如果您已经在使用预编译头文件,请转到项目的属性、C/C++ 和预编译头文件,然后选择不使用它们的选项。

标签: c++ visual-c++ header precompiled-headers stdafx.h


【解决方案1】:

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

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

【讨论】:

  • 不好的做法——你应该总是明确地列出你需要的头文件,这样你就可以检查模块的依赖关系。
  • stdafx 通常包括所有文件通用的平台特定定义。它是每个文件的“依赖项”。您使用它是为了不在每个文件中重复定义。这是一个很好的做法,因为您只在一个地方这样做。
  • 它不是每个文件的依赖项,除非每个文件实际上都需要 stdafx 中的每个标头。在实践中,这种情况很少见(IME)。以这种方式使用它充其量是懒惰,最坏的做法是坏习惯
  • 一个常见的 stdfax.h 将包括 #pragma once 指令、Windows 操作系统版本定义,并包括 windows.h 或 stdio.h。为什么将所有这些分组不好?此外,如果您有自己的标题,实际上是所有文件都需要的,为什么不把它放在那里呢?不好的做法是不这样做。
  • #pragma once 在不启用 pch 支持的情况下无法帮助您跨越模块边界(尝试在 windows.h 中插入 #pragma 消息)。并非一个体面的项目中的所有文件都需要 windows.h/stdio.h/etc。更多原因,请查看我的答案...
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          基本上实现了这一点,通过在您需要的每个文件中包含您需要的标头,例如 iostream、字符串和向量,您每次都有效地将其编译为文件的内联。包括一个“预编译”标题,只是名称应该在那里响起。

          【讨论】:

            猜你喜欢
            • 2011-04-05
            • 1970-01-01
            • 1970-01-01
            • 2012-01-04
            • 1970-01-01
            • 2019-08-20
            • 2010-09-21
            相关资源
            最近更新 更多