Ne peut pas inclure les deux fichiers (WinSock2, Windows.h)
Je vais avoir un problème, y compris les deux fichiers.
Maintenant, je sais que je dois inclure Winsock2 d'abord, puis de windows.h, ou plus simplement:
#define WIN32_LEAN_AND_MEAN
mais, je suis toujours avoir des problèmes de
J'ai un fichier d'en-tête qui est appelé XS.h
qui ressemble à ceci
#ifndef XS_H
#define XS_H
#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>
#endif
et je suis y compris XS.h
dans l'en-tête Client.h
.
Client.h
inclure ressemble à ceci :
#ifndef CLIENT_H
#define CLIENT_H
#include "XS.h"
XS.h
est mon seul inclure dans Client.h
, et pourtant j'ai encore des messages d'erreurs (et comme vous pouvez le voir, Winsock
est inclus avant windows.h
Je reçois environ 78 erreurs, en voici quelques uns :
Error 90 error C3861: 'WSASetLastError': identifier not found c:\program files (x86)\windows kits.0\include\um\ws2tcpip.h 703
Error 61 error C2375: 'WSAStartup' : redefinition; different linkage c:\program files (x86)\windows kits.0\include\um\winsock2.h 2296
Error 49 error C2375: 'send' : redefinition; different linkage c:\program files (x86)\windows kits.0\include\um\winsock2.h 2026
Comment puis-je résoudre ce problème?
Merci!
Edit: j'ai essayé d'utiliser #define _WINSOCKAPI_
, bien qu'il n'a pas résolu mon problème...
J'ai winsock.h
d'abord, puis windows.h
, si cela ne fonctionne toujours l'erreur pour moi.
- utilisation
#pragma once
dans le fichier d'en-tête - Je suggère de toujours inclure windows.h et windowsx.h tout d'abord, dans chaque fichier source (de préférence à l'aide de la stdafx.h de fichier). Je ne suis pas sûr qu'il permet de résoudre ce problème particulier, mais il réduit la confusion beaucoup.
- J'ai changé
Client.h
comprend à présent :#pragma once #include <winsock2.h> #include <ws2tcpip.h> #include "Chat.h"
si elle ne marche pas encore, même des erreurs.... - essayez également dans
Chat.h
- Encore, même erreur.
- Ce pourrait être liée: stackoverflow.com/questions/1372480/c-redefinition-header-files
- MIcrosoft "Intellisense" ne pas utiliser le même moteur d'analyse que le compilateur proprement dite, et de sorte qu'il peut et ne crache "messages d'erreur" pour parfaitement valable code. Cela dit, cela sonne comme un véritable problème, et pas seulement un Intellisense apparente-problème. Vous devez toujours inclure
windows.h
avant d'inclure tout autre API de Windows en-tête. C'est parce que Microsoft les en-têtes en général ne comprennent pas tout ce que dont ils ont besoin, c'est à dire ne pas suivre bien pratique. Il est possible de faire juste<windows.>
forcé inclure, mais qui se répète de la faute qui a causé le problème: mieux corriger la source. - J'ai modifier mon post pour une compréhension plus facile.
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que
<windows.h>
ne comprend pas<winsock.h>
(qui fournit un grand nombre de des mêmes déclarations que<winsock2.h>
). Dans le<winsock2.h>
fichier sur mon système il y a cette ligne:La
_WINSOCKAPI_
inclure garde peut être une mise en œuvre interne de détail, mais comme une solution pratique, je voudrais compter sur elle, juste définition de ce symbole avant, y compris<windows.h>
, par exemple, dans le compilateur invocation (qui pour une IDE de moyens dans l'IDE paramètres du projet).Sinon, vous pouvez essayer de toujours inclure
<winsock2.h>
avant<windows.h>
, afin d'établir la considération notamment de la garde quel qu'il soit (mais c'est je crois beaucoup plus fragiles que juste en supposant que la garde est pratiquement bien définis);ou vous pouvez définir
WIN32_LEAN_AND_MEAN
, ce qui empêche<windows.h>
provenant notamment de la<winsock.h>
, mais aussi quelques autres en-têtes (inscription à partir de la source, sur mon système, ceux qui sont<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>
, et<commdlg.h>
). Je ne recommande pas de se fier surWIN32_LEAN_AND_MEAN
optimisation pour exactitude.I. e., minimum:
WINSOCKAPI
fixe les autres erreurs... Merci!WIN32_LEAN_AND_MEAN
pas le meilleur choix? Pourquoi n'est-il pas de travail? Qu'est-ce que l'inclusion de l'ordre lors de son utilisation?<windows.h>
glisser dans un ou plusieurs de ces en-têtes exclus parWIN32_LEAN_AND_MEAN
. Le documentation juste définit l'effet que "reportez-vous à Windows.H pour déterminer les fichiers qui seront exclus". De sorte que les deux approches sont basées sur la recherche de la MME code d'en-tête, qui est sujet à changement. Peut-être utiliser à la fois quand il n'y a pas de problème avec le fait d'avoir la liste des en-têtes exclus.J'ai fait en sorte qu'un
#include "Winsock2.h"
est avant tout#include "windows.h"
et"#include "Winsock.h"
et cela a résolu le cas.Juste une question de patience, regardez comprend un par un et d'établir cet ordre, d'abord
#include "Winsock2.h"
puis#include "windows.h"
J'ai vérifié le récursive comprend, j'ai repéré les fichiers d'en-tête qui comprennent (de manière récursive) certains #include "windows.h" et "#include "Winsock.h"et écrivez un#include "Winsock2.h". dans ces fichiers, j'ai ajouté#include "Winsock2.h"` comme la première inclure.