【问题标题】:include stdafx.h in header or source file?在头文件或源文件中包含 stdafx.h?
【发布时间】:2011-07-11 04:43:14
【问题描述】:

我有一个名为 stdafx.h 的头文件,当然这个是预编译的。 我已经读到我应该将这些文件包含到我的 .cpp 文件中,但是其中一些语句已经在随附的头文件中需要。

我应该将 stdafx 添加到我的标题中还是添加到我的 cpp 中?我认为将其放入标题中是一种好习惯,但我似乎不得不将其放入标题中。

例子:

stdafx 包含 freeglut。
我的类头文件有一个 GLenum 属性。

我应该将 stdafx 包含在类的 .h 中吗?

【问题讨论】:

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


    【解决方案1】:

    stdafx.h 应该是项目中每个 cpp 文件中的第一个包含。


    考虑 C++ 不编译头文件,只编译 Cpp 文件

    因此,如果 stdafx 是 cpp 文件中的第一个包含,那么编译器将拥有该头文件所需的一切,当它命中 Cpp 文件中的头文件时

    例如

    你有 A.cpp 和 A.h.
    A.h 需要 std:string。

    你有 B.cpp & B.h
    B.h 需要 A.h,因此 B.h 也需要 std::string。

    因为这是一种很好的做法,所以您将 #include <string> 放在 stdafx.h 中。

    您的构建失败,因为什么都看不到 std::string

    现在将 stafx.h 作为第一个包含在 A.cpp 和 B.cpp 中。
    当编译器点击 A.cpp 时,它会选择 <string> 的包含,然后选择 A.h,一切都很顺利,因为我们知道 std::string 是什么。

    编译器现在点击 B.cpp,它再次首先包含 stdafx,它带来了<string>,然后点击了 B.h,它带来了 A.h,它再次很高兴,因为 std::string 已经被包含了。

    希望这会有所帮助。

    【讨论】:

    • 您关于“C++ 不编译头文件,仅编译 Cpp 文件”的评论要么没有任何意义,要么完全错误。请澄清。
    • @John:我想说的是,编译器永远不会单独查看 .h 文件,它只会查看包含在其中的 .h 文件一个 cpp 文件。
    • 明白了。这通常是正确的,尽管我确信您可以强制编译器将 .H 文件直接编译为自己的翻译单元。事实上,在某种程度上,这就是 PCH 的全部意义所在。但是当编译器通过#include 语句“查看”H 文件时,它编译了。
    • @John:我正在尝试为提问者简化事情。我过去发现只有 Cpp 文件才能编译的“谎言”通常是一个有用的学习工具。它可以帮助人们停止纠结,试图弄清楚为什么编译器突然抱怨昨天工作正常的头文件(例如,他们已经在新模块中切换了包含顺序,但是他们花了一个小时寻找在头文件中,而不是包含方式/内容/位置)。
    • 奇怪的是我没有想到这一点。 stdafx 在 .h 文件前面似乎很合乎逻辑,因此它也会找到 stdafx。感谢您的良好实践提示。
    【解决方案2】:
    • 只在你的预编译头文件中包含应该存在的内容
    • 您的预编译头文件必须是每个 .cpp 中的第一个包含
    • 我会避免将它包含在另一个标题中以支持前向声明

    在 stdafx.h 中包含某些内容之前问自己这两个问题

    1. 我永远不会更改此标头吗?
    2. 我是否需要将其包含在 every 多个源文件中?

    如果其中任何一个的答案都是“否”,则不要包括它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多