我正在使用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”未定义。
为什么会这样?
答案 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>
)
因此,当到达 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;
}