对于较新的Windows版本,windows.h包含winsock2.h;对于较老的Windows版本,windows.h包含winsock.h。所以问题的本质并不是在与限制windows.h,而是当winsock.h(或包含winsock.h的windows.h)在winsock2.h之前被包含,编译器就会报错。因为winsock2.h设计来是为了取代winsock.h的,在winsock.h中定义的内容在winsock2.h中同样定义。
如果winsock2.h在winsock.h之前被包含,winsock2.h中定义了_WINSOCKAPI_来避免重复编译winsock.h,但如果头文件顺序反过来,winsock.h不会阻止对winsock2.h的重复编译,编译器就会出现重定义的错误。