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

oxf4rvwz  于 2022-11-26  发布在  Windows
关注(0)|答案(2)|浏览(197)

我正在使用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的顺序,在Windows.h之前包含psapi.h,编译器会变得很糟糕,并向我抛出198个错误,令人惊讶的是(可能只有我),其中包括标识符“BOOL”未定义。为什么会发生这种情况?

czq61nw1

czq61nw11#

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

  • BOOLminwindef.h 中定义(***#157***:(一个月一个月)
  • 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 * 中的一个bug,因为它不是 * 自包含的 *,但可能有一个很好的理由(我不知道)。
无论如何,如果这确实是一个bug,它就不会是 MS 的第一个bug:)

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

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

vc9ivgsu2#

要回答这个问题,我知道这是日期,但问题仍然存在今天。你需要以下:

#include "stdafx.h"
#include <stdbool.h>
#include <Windows.h>
#include <stdlib.h> 
#include <psapi.h>

在包含stdlib.h之后,错误就消失了。

相关问题