使用 <windows.h> 时出现异常的编译器错误

Unusual compiler errors when using <windows.h>

我正在使用 gcc windows 编译器 (g++ -fpermissive -std=c++2a nuevotest.cpp) 来编译这个程序:

#include <iostream>
#include <iomanip>
#include <windows.h>

using namespace std;

int main()
{

    cout << hex << 100 << '\n'; cin.get();

    return 0;
}

我收到有关 windows headers(Windows SDK 版本为 10.0.20348.0)的错误消息:

In file included from C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/shared/minwindef.h:182,
                 from C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/shared/windef.h:24,
                 from C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/windows.h:171,
                 from nuevotest.cpp:4: C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winnt.h: In function 'void TpInitializeCallbackEnviron(PTP_CALLBACK_ENVIRON)': C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winnt.h:24122:33: error: expected primary-expression before ';' token 24122 |     CallbackEnviron->Pool = NULL;
      |                                 ^ C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winnt.h:24123:41: error: expected primary-expression before ';' token 24123 |     CallbackEnviron->CleanupGroup = NULL;
      |                                         ^ C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winnt.h:24124:55: error: expected primary-expression before ';' token 24124 |     CallbackEnviron->CleanupGroupCancelCallback = NULL;
      |                                                       ^ C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winnt.h:24125:36: error: expected primary-expression before ';' token 24125 |     CallbackEnviron->RaceDll = NULL;
      |                                    ^ C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winnt.h:24126:46: error: expected primary-expression before ';' token 24126 |     CallbackEnviron->ActivationContext = NULL;
      |                                              ^ C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winnt.h:24127:49: error: expected primary-expression before ';' token 24127 |     CallbackEnviron->FinalizationCallback = NULL;
      |                                                 ^ In file included from C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/windows.h:203,
                 from nuevotest.cpp:4: C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winsock.h: At global scope: C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winsock.h:108:8: error: redefinition of 'struct timeval'   108 | struct timeval {
      |        ^~~~~~~ In file included from C:/msys64/mingw64/x86_64-w64-mingw32/include/time.h:262,
                 from C:/msys64/mingw64/include/c++/10.2.0/ctime:42,
                 from C:/msys64/mingw64/include/c++/10.2.0/bits/locale_facets_nonio.h:39,
                 from C:/msys64/mingw64/include/c++/10.2.0/locale:41,
                 from C:/msys64/mingw64/include/c++/10.2.0/iomanip:43,
                 from nuevotest.cpp:3: C:/msys64/mingw64/x86_64-w64-mingw32/include/_timeval.h:10:8: note: previous definition of 'struct timeval'    10 | struct timeval
      |        ^~~~~~~ In file included from C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winscard.h:31,
                 from C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/windows.h:208,
                 from nuevotest.cpp:4: C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winioctl.h: In function 'BOOLEAN DeviceDsmAddDataSetRange(PDEVICE_DSM_INPUT, DWORD, LONGLONG, DWORDLONG)': C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/winioctl.h:4842:36: error: expected primary-expression before ';' token  4842 |     PDEVICE_DSM_RANGE Ranges = NULL;
      |                                    ^ In file included from C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um/windows.h:224,
                 from nuevotest.cpp:4: C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/shared/stralign.h: In function 'WCHAR* ua_wcscpy_s(PUWSTR, size_t, PCUWSTR)': C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/shared/stralign.h:450:106: error: expected primary-expression before ')' token   450 |         return (wcscpy_s( (PWSTR)Destination, DestinationSize, (PCWSTR)Source ) == 0 ? Destination : NULL);

包括目录:

C:/Users/jayok/Documents/asio-1.18.0/include
C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um
C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/shared
C:/msys64/mingw64/include/c++/10.2.0
C:/msys64/mingw32/include/c++/10.2.0/i686-w64-mingw32/bits

有些包含文件是从 C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/shared 加载的,有些是从 C:/msys64/mingw64/include 加载的。

因此您的混音包括彼此不兼容的位置。

你不能混合 headers。 MinGW 自带 headers。 您不应该与定义相同事物的其他 headers 混用。

您也可以尝试编译器标志 -IC:/msys64/mingw64/include,但您真的应该清理它。例如检查 C_INCLUDE_PATH 环境变量。

如果您想要最新的 headers 获取最新的 MinGW-w64,例如来自 https://winlibs.com/

的独立版本