为什么更改包含 psapi.h 的顺序会产生编译错误?(标识符 BOOL 未定义)

Why does changing the order of including psapi.h gives compilation erros?(Indentifier BOOL is undefined)

我正在使用 Visual Studio Community 2017 编写 C++ 代码。当我 运行 下面的代码一切正常时。

#include "pch.h"
#include<Windows.h>
#include<Psapi.h>
#include <iostream>
#include <conio.h>

int main()
{

    std::cout << "Really!! How do you do it?";
    _getch();
}

但是,如果我通过在 Windows.h 之前包含 psapi.h 来更改 #include 的顺序,编译器就会变得糟糕并向我抛出 198 个错误,这令人惊讶(也许只对我而言)包括 标识符 "BOOL" 未定义。 为什么会这样?

由于Psapi.h的包含树是微不足道的,我将举例说明。
一切依赖VStudio 2015(社区)v14.0.25431.01更新3) 和 Windows 套件 8.1(?有趣,因为 v10 也在那里)文件(使用默认环境变量和预处理器定义):

  • BOOL 定义在 minwindef.h ( #157: typedef int BOOL;)

  • Psapi.h只包含一个文件(#27: #include <winapifamily.h>)

    • winapifamily.h 不包含任何其他文件

所以,当达到 Psapi.h (#87: BOOL WINAPI EnumProcesses (...), 编译器对 BOOL 一无所知,所以它会抱怨。

Windows.h 包括 minwindef.h(间接地,通过windef.h), 这就是为什么在 Psapi.h.

之前包含它时它起作用的原因

就我个人而言,我认为这是 Psapi.h 中的一个错误,因为它不是 独立的,但可能有有充分的理由(我不知道)。
无论如何,如果这确实是一个错误,那就不会是 MS 的 1st 一个 :)

#include <Windows.h>
#include <WinSock2.h>

// main present just for rigorosity's sake
int main() {
    return 0;
}