servidor - winsock client
No se pueden incluir ambos archivos(WinSock2, Windows.h) (2)
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
, pero sigo recibiendo errores (y como puede ver, Winsock
está incluido antes de windows.h
Recibo aproximadamente 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 resolver este problema?
¡Gracias!
Editar: Intenté usar #define _WINSOCKAPI_
también, aunque no resolvió mis problemas ... Tengo winsock.h
primero, y luego windows.h
, aunque todavía hace el error para mí.
Asegúrese de que <windows.h>
no incluya <winsock.h>
(que proporciona muchas de las mismas declaraciones que <winsock2.h>
). En el archivo <winsock2.h>
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 interno de la implementación, pero como solución práctica confiaría en él, simplemente definiendo este símbolo antes de incluir <windows.h>
, por ejemplo, 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>
, con el fin de establecer el protector de inclusión pertinente sea lo que sea (pero creo que es mucho más frágil que asumir que el guardia anterior está prácticamente bien ... definido);
o puede definir WIN32_LEAN_AND_MEAN
, que previene que <windows.h>
incluya <winsock.h>
pero también algunos otros encabezados (listando de fuente en mi sistema aquellos 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 la optimización WIN32_LEAN_AND_MEAN
para la corrección .
Es decir, mínimo:
#undef UNICODE
#define UNICODE
#undef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>
auto main()
-> int
{}
Me aseguré de que #include "Winsock2.h"
antes de cualquier #include "windows.h"
y "#include "Winsock.h"
y esto resolvió el caso.
Solo una cuestión de paciencia, mira incluye uno por uno y establece este orden, primero #include "Winsock2.h"
luego #include "windows.h"
Revisé el recursivo incluye, vi los archivos de encabezado que incluyen (recursivamente) algunos #include "windows.h" y "#include" Winsock.h "y escribo un # include" Winsock2.h "en estos archivos, agregué #include "Winsock2.h" `como el primer include.