헤더 파일을 두 번 포함하지 못하게하려면 어떻게합니까? 문제는 내가 포함하고 있습니다에 에서 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.h
와 winsock.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"