为什么MinGW-w64需要手动包含winsock2?

M.M*_*M.M 3 c++ windows winsock2 mingw-w64

一些代码和相关的警告/错误:

#include <windows.h>
#include <iphlpapi.h>
int main() { }
Run Code Online (Sandbox Code Playgroud)

F:/Prog/mingw-w64/x86_64-4.9.2-win32-seh-rt_v3-rev1/mingw64/x86_64-w64-mingw32/include/ws2ipdef.h:71:3:错误:' ADDRESS_FAMILY'没有命名类型

ADDRESS_FAMILY si_family;
Run Code Online (Sandbox Code Playgroud)
#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
int main() { }     // this compiles successfully, only gives warning
Run Code Online (Sandbox Code Playgroud)

F:/Prog/mingw-w64/x86_64-4.9.2-win32-seh-rt_v3-rev1/mingw64/x86_64-w64-mingw32/include/winsock2.h:15:2:警告:#warning请包含winsock2.h在windows.h之前[-Wcpp]

#include <winsock2.h>
#include <windows.h>
#include <iphlpapi.h>
int main() { }
Run Code Online (Sandbox Code Playgroud)

(汇编成功).

我的问题是:

  • 为什么不iphlpapi.h(以及依赖于winsock的其他文件)#include <winsock2.h>自己做,或者至少提供更好的错误消息?
  • 为什么之前有警告windows.h呢?

Rem*_*eau 6

windows.h包括winsock.h默认情况. winsock.h并且winsock2.h 不要共存.如果winsock2.h首先包含,则禁用winsock.h,一切都很好.但如果winsock.h首先包含,则winsock2.h无法编译,因为它重新声明了许多winsock.h已经声明的内容.这就是为什么你需要先包括winsock2.h.

微软希望人们使用其中一种,而不是两种. winsock2.h意在取代 winsock.h而不是补充它.但是,为什么他们winsock2.h如此不相容,如果winsock.h首先包括它完全打破是任何人的猜测.他们可以轻松地制作winsock2.h #ifdef任何重复的声明以避免错误.甚至winsock2.h包括winsock.h声明.但他们没有.