No se pueden incluir ambos archivos (WinSock2, Windows.h)

No se pueden incluir ambos archivos (WinSock2, Windows.h)


Tengo un problema al incluir ambos archivos.
Ahora, sé que necesito incluir Winsock2 primero, luego windows.h, o simplemente poner:


#define WIN32_LEAN_AND_MEAN

pero sigo teniendo problemas


Tengo un archivo de encabezado que se llama XS.h que se parece a esto


#ifndef XS_H
#define XS_H
#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>
#endif

y estoy incluyendo XS.h en el encabezado Client.h .
Client.h include se ve así:


#ifndef CLIENT_H
#define CLIENT_H
#include "XS.h"

XS.h es mi única inclusión en Client.h , aún recibo errores (y como puede ver, Winsock se incluye antes de windows.h


Recibo alrededor de 78 errores, estos son algunos de ellos:


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

¿Cómo puedo solucionar este problema?


¡Gracias!


Editar:he intentado usar #define _WINSOCKAPI_ también, aunque no resolvió mis problemas...
Tengo winsock.h primero, luego windows.h , aunque todavía me da el error.


Respuestas:


Asegúrate de que <windows.h> no incluye <winsock.h> (que proporciona muchas de las mismas declaraciones que <winsock2.h> ). En el <winsock2.h> archivo en mi sistema hay esta línea:


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

El _WINSOCKAPI_ include guard puede ser un detalle de implementación interna, pero como una solución práctica confiaría en él, simplemente definiendo este símbolo antes de incluir <windows.h> , p.ej. en la invocación del compilador (que para un IDE significa en la configuración del proyecto IDE).


Alternativamente, puede intentar incluir siempre <winsock2.h> antes de <windows.h> , para establecer la protección de inclusión relevante, sea cual sea (pero creo que esto es mucho más frágil que simplemente asumir que la protección anterior está prácticamente bien definida);


o puede definir WIN32_LEAN_AND_MEAN , lo que evita que <windows.h> de incluir <winsock.h> pero también algunos otros encabezados (listados desde la fuente en mi sistema, esos son <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> y <commdlg.h> ). No recomiendo confiar en WIN32_LEAN_AND_MEAN optimización para corrección .


Es decir, mínimo:


#undef UNICODE
#define UNICODE
#undef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>
auto main()
-> int
{}