2009-09-03 2 views
2

As는 제목에 다음과 같이 설명합니다. 헤더 파일을 여러 번 포함하기 때문에 재정의 오류가 발생합니다. 나는 그것 때문에 그것을 안다. 그러나 나는 해결할 방법을 모른다. 네, 이전에 한 시간 전에 같은 문제를 게시했습니다. 그러나 나는 제대로 설명 할 수 없었고 (나는 그렇게 생각한다) 예상했던 답변을 얻지 못했다.헤더 파일을 여러 번 포함하는 C++ 재정의

C++ Redefinition Header Files

이 :) 가득 되었기 때문에 나는 그 질문을 편집 아니에요 : 여기에 링크입니다.

MAIN.CPP :

#include "Server.h" 
#include "Handler.h" 
#include "Processor.h" 

int main(int argc, char* argv[]) 
{ 

} 

Server.h :

// Server.h 
#pragma once 

#include <winsock2.h> 

처리기

이 좋아 좀 클래스와 이들의 구조는 다음과 같이있다가 .h :

// Handler.h 
#pragma once 

#include <string> 
#include <vector> 

#include "Server.h" 

Processor.cpp :

// Processor.cpp 

#include "StdAfx.h" 
#include "Processor.h" 
#include "Handler.h" 

Server.cpp :

// Server.cpp 

#include "Server.h" 
#include "Processor.h" 

문제는 있지만 어디 <winsock2.h> 모르는 여러 번 포함되어 있다는 것입니다 . 의 #pragma 번 (이 경우 MSVC2008) 내 컴파일러

#ifndef SOME_FILE_H 
#define SOME_FILE_H 
// code here 
#endif // SOME_FILE_H 

과 동일한 기능을 수행한다. 따라서 나는 경비원을 포함한 헤더가 필요 없다는 것을 확신한다. 하지만 내가 실수로하고있는 부분에 <winsock2.>이 두 번 포함되어 있으며 해결 방법을 찾을 수 있습니까?

감사합니다.

+0

Processor.h는 어디에 있습니까? – Klaim

+0

StdAfx.h에 무엇이 있습니까? –

+0

동일한 질문을 두 번 묻는 것은 중복을 만듭니다. 투표를 종료합니다. –

답변

1

stdafx 또는 windows를 포함하기 전에 일부 또는 전부가 필요합니다.

#define _MSWSOCK_ 
#define NCB_INCLUDED 
#define _WINSOCK2API_ 
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */ 
+0

이유를 설명해 주시겠습니까? – akif

+0

@Manzoor : MS 헤더가 배치되는 방식입니다. 규칙을 따라야하지만 규칙이 문서화 된 곳을 모르겠습니다. MS toolchain을 사용하여 작업 할 때 마법사가 초기 빈 프로젝트를 생성하게하는 것이 유익하다는 것을 항상 발견했습니다. 그렇게하면 모든 것이 올바르게 설정되고, 이런 종류의 일에 시간을 허비하지 않게됩니다. –

+0

이유를 모르겠습니다. MFC를 사용하는 외부 헤더를 포함해야했기 때문에 프로젝트에서이 문제가 발생했습니다. 이 문제를 해결할 가능성이 있지만이 솔루션은 빠르며 부작용없이 작동합니다. –

0

다른 답변에서 제안한 것을 시도해 보셨습니까?

진지하게는 #pragma once 대신 포함 가드를 사용해보십시오.

여전히 인 경우 문제가 발생하면 다시 돌아와서 다른 질문을 게시하십시오. 당신이 우리의 조언을 받아들이기를 꺼리는 (또는 할 수 없기 때문에) 동일한 것에 대해 여러 가지 질문을 게시하지 마십시오!

+2

MS 특이성 외에도 #pragma는 한 번 잘못 되었나요? –

+0

다른 질문에서 내 대답을 읽지 않으셨습니까? – akif

+0

진지하게, 당신의 제안은 "나는 MSVC 나 GCC를 사용하지 않으므로 그 컴파일러의 비표준 기능을 사용해서는 안된다"는 것입니다. 누군가가 스레드에 문제가있는 경우 "우선 프로그램을 단일 스레드로 만들어야합니다. 그렇지 않으면 아무에게도 도움이 될 것으로 기대할 수 없습니다"라고 말하지 않습니다. –

5

프로젝트 설정 : 프로젝트 속성 -> 구성 -> 고급 -> 표시가 포함됩니다.

헤더 포함 트리를 덤프하면 거기에서 범인을 볼 수 있습니다.

+0

유용한 팁이 있습니다. – xtofl

0

시도

#ifndef _WINSOCK2API_ 
#include <winsock2.h> 
#endif 

_WINSOCK2API_가 winsock2.h 내에 정의되어 있기 때문에, 컴파일러가 여러 번 포함하지 의지

#include <winsock2.h> 

교체.

+1

시도해보세요. 행운을 빈다 :( – akif

1

나는 최근에 같은 문제가 발생하여 을 포함하여 winsock2.h을 포함하여이를 해결했습니다.

0

이 문제가 기억납니다. windows.h와 winsock2.h 사이의 종속성 문제가 있다고 생각합니다. winsock2.h를 사용하기 전에 항상 windows.h를 포함하여이 파일을 사용하고 있습니다.

관련 문제