为什么更改包含 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;
}
我正在使用 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;
}