Cannot include both files (WinSock2, Windows.h)

Amit picture Amit · Jan 28, 2014 · Viewed 15k times · Source

I'm having a problem including both files. Now, I know I need to either include Winsock2 first, then windows.h, or simply put:

#define WIN32_LEAN_AND_MEAN

but, I'm still having problems

I have a header file that is called XS.h which looks like this

#ifndef XS_H
#define XS_H

#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>

#endif

and I'm including XS.h in the header Client.h. Client.h include is looks like this :

#ifndef CLIENT_H
#define CLIENT_H

#include "XS.h"

XS.h is my only include in Client.h, yet I still get errors (and as you can see, Winsockis included before windows.h

I'm getting about 78 errors, here are some of them :

Error   90  error C3861: 'WSASetLastError': identifier not found    c:\program files (x86)\windows kits\8.0\include\um\ws2tcpip.h   703
Error   61  error C2375: 'WSAStartup' : redefinition; different linkage c:\program files (x86)\windows kits\8.0\include\um\winsock2.h   2296
Error   49  error C2375: 'send' : redefinition; different linkage   c:\program files (x86)\windows kits\8.0\include\um\winsock2.h   2026

How can I solve this issue?

Thanks!

Edit: I've tried to use #define _WINSOCKAPI_ as well, though it did not resolve my problems... I have winsock.h first, then windows.h, though it still does the error for me.

Answer

Cheers and hth. - Alf picture Cheers and hth. - Alf · Jan 28, 2014

Make sure that <windows.h> doesn't include <winsock.h> (which provides many of the same declarations as <winsock2.h>). In the <winsock2.h> file on my system there is this line:

#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */

The _WINSOCKAPI_ include guard may be an internal implementation detail, but as a practical solution I would rely on it, just defining this symbol before including <windows.h>, e.g. in the compiler invocation (which for an IDE means in the IDE project settings).

Alternatively you can try to always include <winsock2.h> before <windows.h>, in order to establish the relevant include guard whatever it is (but this is I think much more fragile than just assuming that the above guard is practically well-defined);

or you can define WIN32_LEAN_AND_MEAN, which prevents <windows.h> from including <winsock.h> but also some other headers (listing from source on my system those are <cderr.h>, <dde.h>, <ddeml.h>, <dlgs.h>, <lzexpand.h>, <mmsystem.h>, <nb30.h>, <rpc.h>, <shellapi.h>, <winperf.h>, <wincrypt.h>, <winefs.h>, <winscard.h>, <winspool.h>, <ole2.h>, and <commdlg.h>). I do not recommend relying on WIN32_LEAN_AND_MEAN optimization for correctness.

I.e., minimum:

#undef UNICODE
#define UNICODE
#undef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>

auto main()
    -> int
{}