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

时间:2018-09-17 12:18:37

标签: c++ windows psapi

我正在使用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();
}

但是,如果我通过在#include之前加上psapi.h来改变Windows.h的顺序,则编译器会陷入僵局并向我抛出198个错误,这令人惊讶地(也许对我来说)包括< strong>标识符“ BOOL”未定义。 为什么会这样?

1 个答案:

答案 0 :(得分:4)

由于 Psapi.h 的包含树是微不足道的,因此我将举例说明。
所有内容均取决于 VStudio 2015 (社区) v14.0.25431.01 Update 3 )和 Windows Kits 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 的1 st 之一:)

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

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