Compiling errors of winsock types redefinition

来源:互联网 发布:网络机顶盒播放器软件 编辑:程序博客网 时间:2024/05/15 09:52

Q:
When compiling a Win32 network application in VC, you may meet many errors from within winsock2.h:
 
c:/program files/devstudio/vc98/include/winsock2.h(99) : error C2011: 'fd_set' : 'struct' type redefinition
c:/program files/devstudio/vc98/include/winsock2.h(134) : warning C4005: 'FD_SET' : macro redefinition
c:/program files/devstudio/vc98/include/winsock.h(83) : see previous definition of 'FD_SET'
c:/program files/devstudio/vc98/include/winsock2.h(143) : error C2011: 'timeval' : 'struct' type redefinition
c:/program files/devstudio/vc98/include/winsock2.h(199) : error C2011: 'hostent' : 'struct' type redefinition
c:/program files/devstudio/vc98/include/winsock2.h(212) : error C2011: 'netent' : 'struct' type redefinition
c:/program files/devstudio/vc98/include/winsock2.h(219) : error C2011: 'servent' : 'struct' type redefinition
 
It appears that this might happen if you #include both winsock2.h and winsock.h, but generally this is not the case - you may find that you only include one header file(say, winsock2.h) in your source.
 
A:
This is because winsock.h is included in windows.h, and windows.h is implicitly included in atlbase.h(for alt project).
 
So winsock2.h must be included before windows.h. 
Or, you can #define WIN32_LEAN_AND_MEAN before you include windows.h and it will stop 
windows.h from including winsock.h. Generally you can do this in StdAfx.h.
 
Also, in winsock2.h:
/*
 * Pull in WINDOWS.H if necessary
 */
#ifndef _INC_WINDOWS
#include <windows.h>
#endif /* _INC_WINDOWS */
 
So you can bypass this including via #define _INC_WINDOWS if necessary.