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
{}