여러 cpp 파일에 정의가있는 h 파일 포함 [중복]
내 문제는 함수 정의가 포함 된 헤더 파일 (사용자 지정 단위 테스트 프레임 워크)이 있다는 것입니다. 예 :
unit_test.h :
#pragma once
...
void Assert(bool b, const string& hint = {})
{
AssertEqual(b, true, hint);
}
...
( unit_test.h
is located in separate directory C:/Dev/include
) 를 포함하여 종종이 기능을 사용하기 때문에 헤더에서 바로 정의 된 일부 함수를 유지하는 것이 편리합니다 .
그러나 여러 cpp 파일이이 기능을 사용하는 프로젝트를 처리하는 경우 예상대로 다중 정의 오류가 발생합니다.
간단한 프로젝트는 다음과 같습니다.
main.cpp :
#include "unit_test.h"
void foo();
int main()
{
Assert(1);
foo();
return 0;
}
foo.cpp :
#include "unit_test.h"
void foo()
{
Assert(2);
}
그래서 헤더 파일에 함수 정의를 유지하고 다중 정의 오류없이 프로젝트에서 사용하는 올바른 방법이 있는지 알고 싶습니다.
( 또는 함수 정의를 소스로 이동하고 매번 별도로 컴파일하거나 unit_test를 정적 라이브러리로 컴파일하는 것이 더 낫습니까? )
답변
이를 달성하는 가장 쉬운 방법 inline
은 함수 정의 에 키워드 를 추가하는 것이지만 최상의 솔루션은 아닙니다.
가장 좋은 방법은 정의를 소스 파일로 이동하는 것이지만 템플릿이 아닙니다.
인라인으로 익명 네임 스페이스를 사용합니다.
namespace {
inline void Assert(bool b, const string& hint = {})
{
AssertEqual(b, true, hint);
}
}
이 오류는 파일을 포함 할 때마다 함수를 다시 정의하기 때문입니다. 해결책은 선언만으로 헤더 파일 unit_test.h 를 만들고 정의를 위해 소스 파일 unit_test.cpp 를 만드는 것 입니다. 이제 헤더 파일을 포함하면 오류가 발생하지 않습니다. 다음과 같이 헤더에 #ifndef를 추가하는 것을 잊지 마십시오
unit_test.h
#ifndef UNIT_TEST_H_
#define UNIT_TEST_H_
// Declare you function
// and end with:
#endif