Ответ 1
@cost answer ссылки к обсуждению, которое, среди прочего, задает этот вопрос, на который никогда не отвечали:
Есть ли причина, по которой я не могу включить windows.h перед winsock2.h, это дает мне массу ошибок, но как только я переключаю их порядок на все все в порядке... почему?
windows.h
включает winsock2.h
при компиляции для более новых версий Windows, но для более старой разработки он включает winsock.h
. Однако проблема не ограничивается только windows.h
. В любое время winsock.h
включается до winsock2.h
, будут ошибки компилятора. Причина в том, что два файла НЕ НЕ сосуществуют очень хорошо. winsock2.h
был предназначен для заменить winsock.h
, а не расширять его. Все, что определено в winsock.h
, также определено в winsock2.h
. Если winsock2.h
включено до winsock.h
, winsock2.h
определяет _WINSOCKAPI_
, чтобы компилятор не обрабатывал последующие winsock.h
, и все в порядке. Но если winsock.h
включен до winsock2.h
, winsock2.h
не обнаруживает этого и пытается переопределить все, что winsock.h
уже определено, в результате чего компиляция завершилась с ошибкой.
Вы должны быть очень осторожны при смешивании кода, который использует winsock.h
с кодом, который использует winsock2.h
в том же проекте. Например, при написании собственного кода сокета, который использует winsock2.h
, и использовании сторонних библиотек, которые все еще используют winsock.h
.