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

Mar*_*nix 14 c++ header-files precompiled-headers stdafx.h visual-studio

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

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

例:

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

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

Bin*_*ier 25

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


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

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

例如

你有A.cpp和啊啊
需要std:string.

你有B.cpp和Bh
Bh需要啊因此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,所以很高兴.

希望这可以帮助.

  • @John:我正在努力为提问者简化一些事情.我在过去发现只有Cpp文件被编译的"谎言"通常是一个有用的学习工具.它可以帮助人们停止自己打结,试图弄清楚为什么编译器会突然抱怨昨天工作正常的头文件(例如,事实证明他们已经在新模块中切换了包含顺序,但是他们花了一个小时看在头文件,而不是如何/什么/它包括在哪里). (6认同)
  • 奇怪的是我没有想到这一点.似乎很合乎逻辑,stdafx位于.h文件前面,所以它也会找到stdafx.感谢您提供良好的练习技巧. (3认同)
  • @John:我试图说,编译器永远不会查看它自己的.h文件,它只会在cpp文件中包含它的上下文中查看.h文件. (2认同)

AJG*_*G85 6

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

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

  1. 这个标题永远不会被我改变吗?
  2. 我是否需要在每个多个源文件中包含此内容?

如果对其中任何一个的回答是"否",则不包括它.