Impossibile includere entrambi i file (WinSock2, Windows.h)

Impossibile includere entrambi i file (WinSock2, Windows.h)


Ho un problema con l'inclusione di entrambi i file.
Ora, so che devo includere prima Winsock2, quindi Windows.h, o semplicemente inserire:


#define WIN32_LEAN_AND_MEAN

ma ho ancora problemi


Ho un file di intestazione che si chiama XS.h che assomiglia a questo


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

e sto includendo XS.h nell'intestazione Client.h .
Client.h include è simile a questo :


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

XS.h è la mia unica inclusione in Client.h , tuttavia ricevo ancora errori (e come puoi vedere, Winsock è incluso prima di windows.h


Ricevo circa 78 errori, eccone alcuni :


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

Come posso risolvere questo problema?


Grazie!


Modifica:ho provato a utilizzare #define _WINSOCKAPI_ inoltre, anche se non ha risolto i miei problemi...
ho winsock.h prima, poi windows.h , anche se continua a fare l'errore per me.


Risposte:


Assicurati che <windows.h> non include <winsock.h> (che fornisce molte delle stesse dichiarazioni di <winsock2.h> ). Nel <winsock2.h> file sul mio sistema c'è questa riga:


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

Il _WINSOCKAPI_ include guard potrebbe essere un dettaglio di implementazione interna, ma come soluzione pratica farei affidamento su di esso, definendo semplicemente questo simbolo prima di includere <windows.h> , per esempio. nella chiamata del compilatore (che per un IDE significa nelle impostazioni del progetto IDE).


In alternativa puoi provare a includere sempre <winsock2.h> prima di <windows.h> , al fine di stabilire la guardia di inclusione rilevante qualunque essa sia (ma penso che sia molto più fragile del semplice presupposto che la guardia di cui sopra sia praticamente ben definita);


oppure puoi definire WIN32_LEAN_AND_MEAN , che impedisce <windows.h> da includere <winsock.h> ma anche alcune altre intestazioni (elencate dalla fonte sul mio sistema quelle sono <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> e <commdlg.h> ). Non consiglio di fare affidamento su WIN32_LEAN_AND_MEAN ottimizzazione per correttezza .


Cioè, minimo:


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