175 votes

Fichiers d’en-tête C++ redéfinition

Comment puis-je empêcher de y compris les fichiers d'en-tête deux fois? Le problème est que je suis, y compris les en MyClass.h et ensuite je suis, y compris MyClass.h à de nombreux fichiers, de sorte qu'il comprend plusieurs fois et de redéfinition erreur se produit. Comment prévenir?

Je suis à l'aide de #pragma once au lieu d'inclure des gardes, et je pense que c'est très bien.

MyClass.h:

// MyClass.h
#pragma once

#include <winsock2.h>

class MyClass
{

// methods
public:
 MyClass(unsigned short port);
 virtual ~MyClass(void);
};

EDIT: Quelques erreurs que je reçois

c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(460) : see previous definition of 'AF_IPX'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(124) : warning C4005: 'AF_MAX' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(479) : see previous definition of 'AF_MAX'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(163) : warning C4005: 'SO_DONTLINGER' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(402) : see previous definition of 'SO_DONTLINGER'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206) : error C2011: 'sockaddr' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(485) : see declaration of 'sockaddr'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing '}' before 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing ';' before 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2059: syntax error : 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C2143: syntax error : missing ';' before '}'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(518) : warning C4005: 'IN_CLASSA' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(287) : see previous definition of 'IN_CLASSA'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(524) : warning C4005: 'IN_CLASSB' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(293) : see previous definition of 'IN_CLASSB'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(530) : warning C4005: 'IN_CLASSC' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(299) : see previous definition of 'IN_CLASSC'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(541) : warning C4005: 'INADDR_ANY' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(304) : see previous definition of 'INADDR_ANY'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(543) : warning C4005: 'INADDR_BROADCAST' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(306) : see previous definition of 'INADDR_BROADCAST'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(577) : error C2011: 'sockaddr_in' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(312) : see declaration of 'sockaddr_in'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(132) : error C2011: 'fd_set' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(68) : see declaration of 'fd_set'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(167) : warning C4005: 'FD_SET' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(102) : see previous definition of 'FD_SET'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(176) : error C2011: 'timeval' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(111) : see declaration of 'timeval'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(232) : error C2011: 'hostent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(167) : see declaration of 'hostent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(245) : error C2011: 'netent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(180) : see declaration of 'netent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(252) : error C2011: 'servent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(187) : see declaration of 'servent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(264) : error C2011: 'protoent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(199) : see declaration of 'protoent'

290voto

pingw33n Points 6428

Ce problème est dû lorsque vous incluez avant . Essayez d’organiser votre include liste que est inclus après ou définir `` première :

Voir aussi cette.

93voto

Pavel Machyniak Points 371

Comme d'autres l'ont suggéré, le problème est que lorsqu' windows.h est inclus avant WinSock2.h. Parce qu' windows.h inclut winsock.h. Vous ne pouvez pas utiliser les deux WinSock2.h et winsock.h.

Solutions:

  • Comprennent WinSock2.h avant windows.h. Dans le cas des en-têtes précompilés, vous devez le résoudre. Dans le cas d'un simple projet, c'est facile. Cependant dans de grands projets (en particulier lors de l'écriture du code portable, sans les en-têtes précompilés) il peut être très difficile, parce que quand votre tête avec WinSock2.h est inclus, windows.h peut être déjà inclus à partir d'un autre en-tête/de mise en œuvre de fichier.

  • Définir WIN32_LEAN_AND_MEAN avant windows.h ou d'un projet à l'échelle. Mais elle exclut de nombreuses autres choses que vous pourriez avoir besoin, et vous devez l'inclure sur votre propre.

  • Définir _WINSOCKAPI_ avant windows.h ou d'un projet à l'échelle. Mais lorsque vous incluez WinSock2.h vous obtenez macro redéfinition d'avertissement.

  • Utiliser windows.h au lieu de WinSock2.h lorsque winsock.h est suffisante pour votre projet (dans la plupart des cas). Ce sera probablement résultat en plus de la compilation, mais résout toutes les erreurs/avertissements.

18voto

Daniel Paull Points 4225

Oh - la laideur de Windows... Ordre d’inclut sont importantes ici. Vous devez inclure winsock2.h avant windows.h. Étant donné que windows.h est probablement incluse de votre en-tête précompilé (fichier stdafx.h), vous devrez inclure winsock2.h de là :

14voto

DevSolar Points 18897

À l’aide de « gardiens de l’en-tête » :

7voto

Yaur Points 4362

Je suis tombé sur ce problème en essayant de tirer sur un paquet de tierce partie qui a été apparemment y compris windows.h quelque part en elle est gâchis des en-têtes. Définition `` du projet niveau était beaucoup plus facile (pour ne pas mentionner plus maintenable) que patauger dans leur soupe et fixer la problématique comprennent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X