一些代码和相关的警告/错误:
#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>
之前会有警告?答案 0 :(得分: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
声明。但他们没有。