15

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

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

例子:

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

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

4

2 回答 2

28

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


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

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

例如

你有 A.cpp & Ah
Ah 需要 std:string。

你有 B.cpp & Bh
Bh 需要 Ah 因此 Bh 也需要 std::string 。

因为这是一种很好的做法,所以您#include <string>输入了 stdafx.h。

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

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

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

希望这可以帮助。

于 2011-03-08T15:15:40.400 回答
6
  • 只在你的预编译头文件中包含应该存在的东西
  • 您的预编译头文件必须是每个 .cpp 中的第一个包含
  • 我会避免将它包含在另一个标题中以支持前向声明

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

  1. 我永远不会更改此标题吗?
  2. 我需要在每个多源文件中都包含这个吗?

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

于 2011-03-08T15:27:14.953 回答