在头文件或源文件中包含stdafx.h?

时间:2011-03-08 15:12:26

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

我有一个名为stdafx.h的头文件,当然这个是预编译的。 我已经读过我应该将这些文件包含在我的.cpp文件中,但是随后会出现一些这样的语句。

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

示例:

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

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

2 个答案:

答案 0 :(得分:25)

  

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

<小时/> 考虑到 C ++不编译头文件,只编译Cpp文件

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

e.g。

你有A.cpp&amp;
回历 A.h需要std:string。

你有B.cpp&amp; 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>的include,然后选择A.h,一切都很开心,因为我们知道std :: string是什么。

编译器现在命中B.cpp,它再次包含stdafx,它会带来<string>,然后命中B.h,这会带来A.h,因为已经包含了std :: string,所以它很高兴。

希望这有帮助。

答案 1 :(得分:6)

  • 仅包含预编译标题中应包含的内容
  • 您的预编译头文件必须是每个.cpp
  • 中的第一个
  • 我会避免将其包含在另一个标题中,以支持前向声明

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

  1. 这个标题永远不会被我改变吗?
  2. 我是否需要在每个多个源文件中包含此内容?
  3. 如果其中任何一个的答案为“否”,则不包括它。