使用 <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/
的独立版本
我正在使用 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/
的独立版本