stdafx.h,pch.h

stdafx.h名称的英文全称为:Standard Application FrameworkExtensions 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。   预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。   编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include"stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码.因此,所有的MFC实现文件第一条语句都是:#include "stdafx.h"。
来自百度~ stdafx.h中没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。   Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。   为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示:   ◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFCinclude文件。且这一文件可以随被选择的选项而变化。   ◎AppWizard然后就建立Stdafx.cpp。这个文件通常都是一样的。   ◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。   ◎当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。)   ◎当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编辑了stdafx.cpp或stdafx.h。   这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。)在这个过程中你必须遵守以下规则:   ◎你编写的任何.cpp文件都必须首先包含stdafx.h。   ◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。   ◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。   如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立。 ????????????????? 在实际项目中,每一个.cpp都包含stdafx.h,但是我在执行重新编译时,是不是就意味着不需要编译很多的windows的头文件了?可以通过什么实验,验证时间快,为什么在每一个cpp中都包含,不可以直接在一个头文件中包含吗?(mura检测的代码,每一个.cpp文件都包含了)
MSVC 的 Precompiled header files 机制,以加速对不常修改的头文件(通常是基础库)的编译。由 VS2017 IDE 创建的工程,pch.cpp(对于 VS2005/2008 是 stdafx.cpp)和其它 .cpp 的编译选项不同 (Debug Build for example):cl /Yc"pch.h" /Fp"Debug\" pch.cppcl /Yu"pch.h" /Fp"Debug\" others.cpp一般规则:不要删除 pch.h/.cpp;不要修改 pch.cpp;在其它 .cpp 中首先 #include "pch.h"。当对 MSVC 的选项熟悉后,可以用 .bat、nmake、msbuild、cmake 等工具自定义工程的源码组织和编译构建,那时要不要 pch.h/.cpp 就随意了。 #### targetver.h的作用 定义程序运行的环境,如限制程序只能在XP下运行,限制程序在只能在Vin7下运行,或限制程序只能在XP以上系统运行,或限制程序只能在Server2003以上系统运行... targetver.h
#pragma once

// Including SDKDDKVer.h defines the highest available Windows platform.

// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.

#include <SDKDDKVer.h>
stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files
#include <windows.h>



// reference additional headers your program requires here

stdafx.cpp
#include "stdafx.h"
参考: https://blog.csdn.net/weixin_41813895/article/details/79698789

ifdef WIN32有什么作用

经常在程序中碰到#ifdef WIN32这样的代码,实际上这提供了一种抽象机制,使代码可以在不同平台间移植; 由编译器(ml.exe/ml64.exe)内部定义的。具体描述是:   _WIN32:Defined for applications for Win32 and Win64. Always defined.   _WIN64:Defined for applications for Win64.   windows平台上总是会有这种宏,所以用来判断是否是windows平台。 MSDN 里说,VC 有 3 个预处理常量,分别是 _WIN32,_WIN64,WIN32。这三个常量如何使用呢?看起来简单,其实是很困惑的。 先说结论: 1、   WIN32/_WIN32 可以用来判断是否 Windows 系统(对于跨平台程序) 2、 _WIN64 用来判断编译环境是 x86(32位) 还是 x64(64位) 在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义。 在 x64 配置下,_WIN32 和_WIN64 都有定义。 也就是说,肯定可以用_WIN32来判断平台是否是Windows平台,如果要跨平台,那么在 #ifndef _WIN32  的环境下就得准备好对应平台上需要的配置或类型定义。