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

时间:2015-03-16 05:02:55

标签: c++ windows winsock2 mingw-w64

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

#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:错误:'{{1 }''没有命名类型

ADDRESS_FAMILY
ADDRESS_FAMILY si_family;
  

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请包含windows.h之前的winsock2.h [-Wcpp]

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

(编译成功)。

我的问题是:

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

1 个答案:

答案 0 :(得分:6)

windows.h默认包含winsock.hwinsock.hwinsock2.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声明。但他们没有。