Почему изменение порядка включения psapi.h приводит к ошибкам компиляции? (Indentifier BOOL не определен) - PullRequest
0 голосов
/ 17 сентября 2018

Я использую Visual Studio Community 2017 для написания кода на С ++.Когда я запускаю следующий код, все работает нормально.

#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 ошибок,что неожиданно (возможно, только для меня) включает Идентификатор "BOOL" не определен .Почему это происходит?

1 Ответ

0 голосов
/ 17 сентября 2018

Поскольку дерево включения Psapi.h тривиально, я собираюсь привести пример.
Все зависит от VStudio 2015 (Сообщество) ( v14.0.25431.01 Update 3 ) и Windows Kits 8.1 (? Смешно, потому что v10 там тоже есть) файлы (с заданными по умолчанию переменными env и определениями препроцессора):

  • 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 one:)

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

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