Impossible d’inclure les deux fichiers (WinSock2, Windows.h)

J’ai un problème avec les deux fichiers. Maintenant, je sais que je dois d’abord inclure Winsock2, puis Windows.h, ou tout simplement:

#define WIN32_LEAN_AND_MEAN 

mais j’ai toujours des problèmes

J’ai un fichier d’en-tête appelé XS.h qui ressemble à ceci

 #ifndef XS_H #define XS_H #include  #include  #include  #endif 

et XS.h dans l’en-tête Client.h . Client.h include is ressemble à ceci:

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

XS.h est mon seul Client.h inclus dans Client.h , mais des erreurs se Client.h (et comme vous pouvez le constater, Winsock est inclus avant windows.h

Je reçois environ 78 erreurs, en voici quelques unes:

 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 

Comment puis-je résoudre ce problème?

Merci!

Edit: j’ai aussi essayé d’utiliser #define _WINSOCKAPI_ , bien que cela ne résolve pas mes problèmes … J’ai d’abord winsock.h , puis winsock.h .

Assurez-vous que n’inclut pas (qui fournit plusieurs des mêmes déclarations que ). Dans le fichier de mon système, il y a cette ligne:

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

Le _WINSOCKAPI_ include guard peut être un détail d’implémentation interne, mais comme solution pratique, il suffit de définir ce symbole avant d’inclure , par exemple dans l’invocation du compilateur (qui, pour un IDE, signifie dans les parameters du projet IDE ).

Alternativement, vous pouvez essayer de toujours inclure avant , afin d’établir la garde correspondante (quoi que ce soit d’autre) (mais je pense que c’est beaucoup plus fragile que de supposer que la garde ci-dessus est pratiquement bien défini);

ou vous pouvez définir WIN32_LEAN_AND_MEAN , ce qui empêche d’inclure mais aussi d’autres en-têtes (listant les sources sur mon système: , , , , , , , , , , , , , , et ). Je vous déconseille de vous fier à l’optimisation de WIN32_LEAN_AND_MEAN pour son exactitude .

C’est-à-dire minimum:

 #undef UNICODE #define UNICODE #undef _WINSOCKAPI_ #define _WINSOCKAPI_ #include  #include  auto main() -> int {} 

Je me suis assuré que #include "Winsock2.h" était avant tout #include "windows.h" et "#include "Winsock.h" et que l’affaire était résolue.

Juste une question de patience, regardez inclut un à un et établissez cet ordre, d’abord #include "Winsock2.h" puis #include "windows.h"

J’ai vérifié les inclusions récursives, j’ai repéré les fichiers d’en-tête qui incluent (récursivement) des #include “windows.h” et “#include” Winsock.h et écris un # include “Winsock2.h”. #include “Winsock2.h” `en tant que première inclusion.