一些代码和相关的警告/错误:
#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 回答
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
包括声明的winsock.h
. 但他们没有 .