C++ 我什么时候需要它?

C++ 我什么时候需要它?,c++,visual-c++,header,precompiled-headers,stdafx.h,C++,Visual C++,Header,Precompiled Headers,Stdafx.h,我看到很多代码,包括stdafx.h。比如说,我不想要预编译的标题。我将自己手动包含所有必需的系统头。在这种情况下,是否有任何其他合理的理由我应该知道我需要stdafx.h?即使没有预编译的头文件,stdafx.h也很方便,因为它将头文件和所有文件的通用定义分组 当然,您可以选择在每个文件中重复所有这些定义。stdafx.h不是严格必需的。stdafx.h只是另一个头文件。如果你觉得你不需要它,那么可以随意不包括它,并将其从项目中删除 但是,有一个像stdafx.h这样的文件,使预编译头能够正常

我看到很多代码,包括stdafx.h。比如说,我不想要预编译的标题。我将自己手动包含所有必需的系统头。在这种情况下,是否有任何其他合理的理由我应该知道我需要
stdafx.h

即使没有预编译的头文件,stdafx.h也很方便,因为它将头文件和所有文件的通用定义分组


当然,您可以选择在每个文件中重复所有这些定义。stdafx.h不是严格必需的。

stdafx.h
只是另一个头文件。如果你觉得你不需要它,那么可以随意不包括它,并将其从项目中删除


但是,有一个像stdafx.h这样的文件,使预编译头能够正常工作,并且不在每个源文件中手动包含所有内容,这是非常典型的做法。

如果您不想使用预编译头,那么使用标准的include文件就没有意义了——这将减慢包含它的每个文件的构建速度,并导致它们包含它们不需要的额外内容。去掉它,只包含他们需要的头。

正如其他人所提到的:如果不需要预编译头,就不需要stdafx.h。事实上,仅仅用它来分组公共包含是非常糟糕的做法

事实上,即使在使用预编译头时,最好在stdafx.h(或precompiled.h或任何您想称之为它的名称)之后包含流程实际需要的头,并在预编译头中添加#ifdef magic以关闭PCH的使用


为什么??以检查您的模块依赖关系。禁用PCH可以让您了解是否包含必要的模块,然后您可以编写一个工具,通过解析.cpp和.h文件(当然不包括PCH头)来检查模块的相互依赖性。

您可以使用预编译头(这是一件好事),而不必使用stdafx.h(我也讨厌它)。我只能访问VC++6.0,但在这里,请转到项目设置| C/C++|预编译头并选择“自动使用预编译头”,但将“编译通过”框保留为空。

我知道这是一个旧线程,但我想我会将我的意见传达给读者。我在2017年发现了这个,所以我相信我不是唯一一个会在这里的人

使用预编译的头文件有一个优势,其他人可能会忽略这一点,因为他们已经使用了多年的实践。C++标准有了很大的发展。不需要在20个文件中包含向量,你可能需要什么,你使用一个PCH文件,编译器需要做的工作更少,这让每个人都很开心。您还可以将常用宏放在其中,例如验证、断言和智能类对象。不要把你的类头放在那里,这是没有意义的,而是标准库或者你需要在很多地方全局使用的东西,比如我提到的宏


基本上可以实现这一点,通过在每个需要的文件(如iostream、string和vector)中包含所需的头文件,每次都可以将其作为内联文件进行有效编译。包括一个“预编译”的头,好吧,只是名字应该在那里敲钟

错误的做法-您应该始终明确列出所需的标题,以便检查模块依赖关系。stdafx通常包括所有文件通用的特定于平台的定义。它是每个文件的“依赖项”。使用它是为了避免在每个文件中重复定义。这是一个很好的实践,因为您只在一个位置执行此操作。它不是每个文件的依赖项,除非每个文件实际上都需要stdafx中的每个头。在实践中,这种情况很少发生(IME)。以这种方式使用它充其量是懒惰的,worstA common stdfax.h的糟糕做法将包括#pragma once指令、windows操作系统版本定义以及windows.h或stdio.h等内容。为什么把这些都归在一起不好?。另外,如果您有自己的头,这实际上是所有文件都需要的,为什么不把它放在那里呢?错误的做法是不这样做。#pragma once在不启用pch支持的情况下无法帮助您跨越模块边界(请尝试在windows.h中插入#pragma消息)。不是一个体面的项目中的所有文件都需要windows.h/stdio.h/etc。出于更多原因,请检查我的答案…(对于任何使用此作为参考的人)如果您已经在使用预编译头,请转到项目的属性、C/C++和预编译头,并选择不使用它们的选项。StdAfx.h对于新手: