2015-03-16 4 views
3

Некоторые кода и связанные с ними предупреждения/ошибки:Почему MinGW-w64 требует, чтобы winsock2 был включен вручную?

#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: error: ' ADDRESS_FAMILY ' does not name a type

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: #warning Please include winsock2.h before windows.h [-Wcpp]

#include <winsock2.h> 
#include <windows.h> 
#include <iphlpapi.h> 
int main() { } 

(compilation successful).

Мои вопросы:

  • Почему не iphlpapi.h (и другие файлы, которые полагаются на winsock) do #include <winsock2.h> сами, или, по крайней мере, дать более приятное сообщение об ошибке?
  • Почему существует предупреждение, что оно должно быть до windows.h?
+0

О части предупреждения, исходный файл от MS также имеет проблемы с заказом на включение. Windows.h определяет некоторые вещи winsock2..h тоже, если они еще не определены, но разные. Winsock2.h должен быть первым, чтобы получить правильные определения. – deviantfan

+0

http://stackoverflow.com/questions/21399650/cannot-include-both-files-winsock2-windows-h тоже обращается к этой проблеме – deviantfan

+0

@deviantfan, что ответ, казалось, объяснил, что этот заказ требуется, но не почему –

ответ

6

windows.h содержит winsock.h по умолчанию. winsock.h и winsock2.hне сосуществуют. Если winsock2.h включен первым, он отключает winsock.h, и все это хорошо. Но если winsock.h включен первым, winsock2.h не скомпилируется, поскольку он переопределяет множество вещей, которые уже объявляет winsock.h. Таким образом, вы должны сначала включить winsock2.h.

Microsoft хочет, чтобы люди использовали один или другой, а не оба. winsock2.h предназначенный для заменитьwinsock.h, а не приложение. Но почему они сделали winsock2.h настолько несовместимым, что он полностью ломается, если в комплект входит winsock.h. Они могли бы так же легко сделать winsock2.h#ifdef любые повторяющиеся объявления, чтобы избежать ошибок. Или даже у winsock2.h есть winsock.h для деклараций. Но они этого не сделали.

+0

mingw-w64 действительно работает, если вы включили winsock2 second (он дает только #warning). Возможно, mingw-w64 не поддерживает winsock1 вообще, или, может быть, он пошел дальше и сделал эти «так же легко». –

+0

Я подозреваю, что версия 'windows.h' mingw включает' winsock2.h' вместо 'winsock.h', если она включает в себя либо одну из них вообще. –

+0

Я не думаю, что это тоже включает, так как моя первая программа была бы скомпилирована, если бы так –

Смежные вопросы