首页 文章

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

提问于
浏览
3

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

#include <windows.h>
#include <iphlpapi.h>
int main() { }

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;

#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
int main() { }     // this compiles successfully, only gives warning

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() { }

(编译成功) .

我的问题是:

  • 为什么不 iphlpapi.h (和其他依赖winsock的文件)自己做 #include <winsock2.h> ,或者至少给出一个更好的错误信息?

  • 为什么在 windows.h 之前会有警告?

1 回答

  • 6

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

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

相关问题