2012-01-19 4 views
1

그래서 프로토 타입뿐만 아니라 함수 구현이 포함 된 헤더 파일이 있습니다. 지금은 이러한 구현을 파일에서 분리하려고 시도하고 있으며 프로토 타입을 그대로 두는 것은 헤더 파일에 구현 된 표준이 좋지 않기 때문입니다. 그러나 헤더 파일에서 구현을 제거하고 자신의 cpp 파일에 넣은 다음 해당 함수의 여러 정의에 대해 불평하는 나머지 프로젝트에 해당 cpp 파일을 연결하려고 시도합니다. 어떤 도움이나 조언을 주셔서 감사합니다C++ 다중 정의

std::bitset<LENGTH> foo1(const std::string stringVal); 
std::bitset<LENGTH> foo2(const int decimalVal); 
std::string   foo3(const int integerVal); 

나는 포함 가드를 가지고 있기 때문에 두 번 이상 포함되지 않습니다.

그러면 cpp에서이 기능에 대한 구현을 간단하게 수행 할 수 있습니다. 그러나 헤더 파일과 분리 된 경우 여러 함수 정의에 대해 불평합니다.

편집 : 내 부분에 어리석은 실수가 해결되었습니다.

+4

오류 메시지 란 무엇이며 오류 메시지를 유발하는 코드는 무엇입니까? –

+0

질문에 답변 할 수있는 충분한 정보를 제공하지 않았습니다. 최소한 (1) 헤더 파일의 내용, (2) .cpp 파일의 내용, (3) 링커 명령 줄을 보여주는 작은 예제를 제공하십시오. 특히'#include '줄이 아마도 가장 적합 할 것이다. –

답변

1

이것은 단지 선언입니다. 파일에 가드가 없더라도 오류가 발생하지 않습니다.

일반적으로 다중 정의는 둘 이상의 구현 파일에서 함수를 정의한다는 것을 의미합니다.

  • 는 구현이 헤더의 외부 definetely 있는지 확인 :

    여기에 체크리스트입니다.

  • 확인 하나의 소스 파일 (이 하나가 사소한, 당신이이 일을 알지 희망) 당신이 소스 파일을 포함하지 않는 수 있도록 마지막

  • 기능을

  • 을 정의 , 당신이 깨끗한 빌드를 실행하는지 확인하십시오.

0

이전에 헤더 파일을 포함하고있는 다른 cpp 파일을 컴파일하지 않았을 것입니다. 따라서 오브젝트 파일에는 여전히 정의가 들어 있습니다. 헤더 파일에 구현되지 않은 BTW는 좋은 표준에 관한 것이 아닙니다. 하나 이상의 컴파일 유닛에 동일한 헤더를 포함 할 수 있도록해야합니다.

+2

실제로, 메소드가 인라인이거나 템플릿을 사용하는 경우 헤더 파일에 구현할 수 있습니다 (이 경우 필수). –

+0

네가 맞아, 미안해, 나는 스타일이나 좋은 기준의 문제가 아니라는 것을 강조하려고 노력했다. 어느 쪽이든 그것은 템플릿 기능의 경우에도 필요합니다 (인라인의 경우 경고 메시지로 살 수는 있지만) – enobayram