태그 보관물: redefinition

redefinition

C ++ 재정의 헤더 파일 (winsock2.h) error C2143:

헤더 파일을 두 번 포함하지 못하게하려면 어떻게합니까? 문제는 내가 포함하고 있습니다에서 MyClass.h 후 나는 포함하고있어 에서 MyClass.h 이 여러 번 포함하고 재정의 오류가 발생하므로, 많은 파일을. 방지하는 방법?

경비원을 포함시키는 대신 #pragma를 한 번 사용하고 있는데 괜찮습니다.

MyClass.h :

// MyClass.h
#pragma once

#include <winsock2.h>

class MyClass
{

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

편집 : 내가 얻는 오류 중 몇 가지

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'


답변

이 문제는 <windows.h>before를 포함 할 때 발생 <winsock2.h>합니다. 당신이 목록에 포함 주선 시도 <windows.h>후 포함 <winsock2.h>또는 정의 _WINSOCKAPI_를 먼저 :

#define _WINSOCKAPI_    // stops windows.h including winsock.h
#include <windows.h>
// ...
#include "MyClass.h"    // Which includes <winsock2.h>

참조 .


답변

다른 사람들이 제안했듯이 문제는 windows.h이전에 포함될 때 입니다 WinSock2.h. windows.h포함 하기 때문에 winsock.h. 둘 다 사용할 수 없습니다 WinSock2.hwinsock.h.

솔루션 :

  • WinSock2.h전에 포함하십시오 windows.h. 미리 컴파일 된 헤더의 경우이를 해결해야합니다. 간단한 프로젝트의 경우 쉽습니다. 그러나 큰 프로젝트 (특히 미리 컴파일 된 헤더없이 휴대용 코드를 작성할 때)에는 헤더 WinSock2.h가 포함되어 있을 때 windows.h다른 헤더 / 구현 파일에서 이미 포함 될 수 있기 때문에 매우 어려울 수 있습니다.

  • 정의 WIN32_LEAN_AND_MEAN하기 전에 windows.h또는 넓은 전망이다. 그러나 그것은 당신이 필요로 할 수있는 많은 다른 것들을 배제 할 것이고 당신은 그것을 스스로 포함시켜야합니다.

  • 정의 _WINSOCKAPI_하기 전에 windows.h또는 넓은 전망이다. 그러나 포함 WinSock2.h하면 매크로 재정의 경고가 나타납니다.

  • 사용 windows.h대신 WinSock2.h하는 경우 winsock.h(대부분의 경우입니다) 프로젝트에 충분하다. 컴파일 시간이 길어 지지만 오류 / 경고는 해결됩니다.


답변

아-Windows의 추악함 … 포함 순서가 중요합니다. windows.h 앞에 winsock2.h를 포함시켜야합니다. windows.h는 미리 컴파일 된 헤더 (stdafx.h)에 포함되어 있으므로 winsock2.h를 포함시켜야합니다.

#include <winsock2.h>
#include <windows.h>

답변

“헤더 가드”를 사용하여 :

#ifndef MYCLASS_H
#define MYCLASS_H

// This is unnecessary, see comments.
//#pragma once

// MyClass.h

#include <winsock2.h>

class MyClass
{

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

#endif

답변

헤더의 혼란에 어딘가에 windows.h를 포함하는 타사 패키지를 가져 오려고 할 때이 문제가 발생했습니다. _WINSOCKAPI_프로젝트 수준에서 정의 하는 것은 수프를 넘어 가고 문제가있는 포함을 수정하는 것보다 훨씬 쉬웠습니다 (더 유지 관리하기 쉬운 것은 아닙니다).


답변

VS 2015에서는 다음이 작동합니다.

#define _WINSOCKAPI_

다음은 그렇지 않습니다.

#define WIN32_LEAN_AND_MEAN

답변

나는 (재귀 적으로) 포함 헤더 파일을 발견, 재귀 포함 검사 일부 #include "windows.h"#include "Winsock.h"와 쓰기 #include "Winsock2.h". 이 파일에 추가했습니다#include "Winsock2.h" 에서 첫 번째 포함으로 했습니다.

인내심의 문제가 포함 모습에 하나씩 먼저,이 순서를 설정 #include "Winsock2.h"한 후#include "windows.h"