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, Winsock
is 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.
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
{}