여러 cpp 파일에 정의가있는 h 파일 포함 [중복]

Aug 21 2020

내 문제는 함수 정의가 포함 된 헤더 파일 (사용자 지정 단위 테스트 프레임 워크)이 있다는 것입니다. 예 :
unit_test.h :

#pragma once
...    
void Assert(bool b, const string& hint = {})
{
    AssertEqual(b, true, hint);
}
...

( unit_test.his 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를 정적 라이브러리로 컴파일하는 것이 더 낫습니까? )

답변

1 KrzysztofMochocki Aug 21 2020 at 17:43

이를 달성하는 가장 쉬운 방법 inline은 함수 정의 에 키워드 를 추가하는 것이지만 최상의 솔루션은 아닙니다.

가장 좋은 방법은 정의를 소스 파일로 이동하는 것이지만 템플릿이 아닙니다.

1 Nikola Aug 21 2020 at 18:00

인라인으로 익명 네임 스페이스를 사용합니다.

namespace {
    inline void Assert(bool b, const string& hint = {})
    {
        AssertEqual(b, true, hint);
    }
}
Imran Aug 21 2020 at 18:12

이 오류는 파일을 포함 할 때마다 함수를 다시 정의하기 때문입니다. 해결책은 선언만으로 헤더 파일 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