C++ 是否在头文件或源文件中包含stdafx.h?

C++ 是否在头文件或源文件中包含stdafx.h?,c++,visual-studio,header-files,precompiled-headers,stdafx.h,C++,Visual Studio,Header Files,Precompiled Headers,Stdafx.h,我有一个名为stdafx.h的头文件,这个文件当然是预编译的。 我已经读到应该将这些文件包括在.cpp文件中,但其中一些语句已经需要在随附的头文件中 我应该将stdafx添加到标题中还是添加到cpp中?我认为把球放进头球是一个很好的练习,但我似乎不得不把球放进头球 例如: stdafx包含freeglut。 我的类头文件具有GLenum属性 我是否应该将stdafx包含在类的.h中 stdafx.h应该是项目中每个cpp文件的第一个包含项 请考虑 C++不编译头文件,只是CPP文件>/P> 因

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

我应该将stdafx添加到标题中还是添加到cpp中?我认为把球放进头球是一个很好的练习,但我似乎不得不把球放进头球

例如:

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

我是否应该将stdafx包含在类的.h中

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


请考虑<强> C++不编译头文件,只是CPP文件>/P> 因此,如果stdafx是cpp文件中的第一个include,那么当它命中cpp文件中的头文件时,编译器将拥有头文件所需的一切

e、 g

您有A.cpp和A.h.
A.h需要std:string

您有B.cpp和B.h
B.h需要A.h,因此B.h也需要std::string

因为这是一个很好的实践,所以您将
#include
放在stdafx.h中

生成失败,因为没有任何内容可以看到std::string

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

编译器现在点击B.cpp,它再次首先包括stdafx,它带来了
,然后点击B.h,它带来了A.h,它再次感到高兴,因为std::string已经被包括在内

希望这有帮助。

  • 只在预编译头中包含应该存在的内容
  • 预编译头文件必须是每个.cpp中的第一个包含文件
  • 我会避免将其包含在另一个标题中,以支持转发声明
在stdafx.h中包含某些内容之前,先问问自己这两个问题

  • 我永远不会改变这个标题吗
  • 我需要在每个多个源文件中都包含这个吗

  • 如果答案是“否”,那么就不要包含它。

    您关于“C++不编译头文件,只编译Cpp文件”的评论要么没有任何意义,要么是完全错误的。请澄清。@John:我想说的是,编译器永远不会单独查看.h文件,它只会在包含在cpp文件中的上下文中查看.h文件。明白了。这通常是正确的,尽管我相信您可以强制编译器直接编译一个.H文件作为一个翻译单元。事实上,在某种程度上,这就是PCH的全部观点。但是当编译器通过
    #include
    语句“查看”一个H文件时,它被编译了。@John:我正试图为询问者简化一些事情。我在过去发现,只有Cpp文件才能编译的“谎言”通常是一个有用的学习工具。这有助于人们不再纠结于试图弄明白为什么编译器突然抱怨一个头文件昨天工作得很好(例如,结果发现他们在一个新模块中切换了包含顺序,但是他们花了一个小时查看头文件,而不是看它是如何/什么/在哪里包含的).奇怪的是我没有想到那一点。stdafx位于.h文件的前面似乎很合乎逻辑,因此它也会找到stdafx。谢谢你的好的练习技巧。