C++ 为什么不是';t包括stdafx.h对于VisualStudio来说不够吗?

C++ 为什么不是';t包括stdafx.h对于VisualStudio来说不够吗?,c++,visual-studio,precompiled-headers,stdafx.h,C++,Visual Studio,Precompiled Headers,Stdafx.h,我知道预编译头的目的是通过使用已经编译过一次的对象文件并将其链接到实际项目来加速编译过程。但我不明白的是,为什么我应该明确地强制VisualStudio使用stdafx.h(项目属性->C/C++->预编译头->预编译头)?为什么不包括“stdafx.h”还不够 为什么包含“stdafx.h”[…]还不够 因为这只是一个标准C++预处理器指令。*就编译器而言,与包含“< /代码>”没有什么不同。如果需要附加额外的语义,则必须告诉编译器 由于Visual Studio实现预编译头的方式似乎存在混淆

我知道预编译头的目的是通过使用已经编译过一次的对象文件并将其链接到实际项目来加速编译过程。但我不明白的是,为什么我应该明确地强制VisualStudio使用
stdafx.h
(项目属性->C/C++->预编译头->预编译头)?为什么不包括“stdafx.h”还不够

为什么包含“stdafx.h”[…]还不够

因为这只是一个标准C++预处理器指令。*就编译器而言,与<代码>包含“< /代码>”没有什么不同。如果需要附加额外的语义,则必须告诉编译器

由于Visual Studio实现预编译头的方式似乎存在混淆,因此这里有一个指向文档的链接:



*请注意,名称“stdafx.h”没有什么特别之处,只是它是用于生成PCH的默认头文件名。

所谓的
stdafx.h
应该是一个普通头文件。它的名字没有什么特别之处。它不应该自动启用预编译头

其思想是,任何其他编译器和/或当您不知道如何在MSVC中使用预编译器头文件时,
stdafx.h
将被视为普通头文件


应该是您告诉MSVC编译器您实际上想要启用预编译头。这就是为什么要设置项目。并且只有在启用预编译头时,
stdafx.h
将获得其特殊角色,并将从编译器处获得特殊处理。而且它不一定是stdafx.h。通过在“项目设置”中指定其他名称,可以将此特殊角色分配给任何其他标题


事实上,在一个与Microsoft特定库或框架无关的项目中看到对AFX的引用是相当奇怪的。

您必须告诉IDE是否要创建PCH。请不要盲目否定,并提供一些提示,说明应该改进哪些方面。在我的Visual Studio项目中,PCH头甚至没有命名为
stdafx.h
。虽然我使用了一个带有CMake的宏来指定PCH头的名称,但很抱歉,我不懂。还有什么附加语义?编译器只是将
#include“stdafx.h”
替换为
stdafx.h
的内容。从这一点上,我可以调用
stdafx.h
中声明的函数,编译器不会抱怨。编译后,
stdafx.obj
文件与我的项目链接。我不认为有必要在这里明确指定其他内容。@WakanTanka:您已经描述了标准语义。附加的语义是,编译器用头的预处理和预编译版本替换
#include
指令。此外,头文件不是编译单元。没有“stdafx.obj”文件(除非您还提供了“stdafx.cpp”文件,这是为PCH提供的)。.Obf文件与PCH无关,没有什么可以禁止编译器使用预编译的头来实现<代码> >包括“STDAFX.H”< /C>,只要它的行为与标准C++预处理器指令相同,并且可以像往常一样返回文件。不,这不仅仅是理论上的,这至少是GCC真正的作用。“我检查你的答案表明,<代码>包含了是一个标准的C++预处理器指令,意味着它不能导致预编译的头。一个实际编译器的反例,它确实执行了,这表明该逻辑是不正确的。您能更具体地说明从编译器收到的确切的特殊处理是什么吗
stdafx.h
?它与经典的编译链接过程有何不同?@Wakan Tanka:Header预编译与“链接”无关。这是一个完全不同的过程。
stdafx.h
接受的“特殊处理”基本上是:其内容只预编译一次,然后以预编译的形式使用。这就是它的全部。“应该是你告诉MSVC编译器你实际上想要启用预编译头。”当我做了
#包括“stdafx.h”
?@WakanTanka:不。这与编写
#包括“myheader.h”
没有什么不同。它只是一个头文件,没有特殊意义。是的,我有。我真的很感激你的帮助,但我还是不明白。我理解
#include“stdafx.h”
没有特殊意义,但我不明白为什么应该这样做。如果
stdafx.obj
存在,为什么不能在链接时间内使用它。我不明白为什么
stdafx.h
应该与任何常规头文件不同。有
stdafx.h
然后有
stdafx.cpp
包含它,编译后从中创建
stdafx.obj
,该
stdafx.obj
在链接期间链接。因此,
stdafx.obj
只创建一次,但每次我重新编译项目时都会链接。