문제

고객이 더 쉽게 사용할 수 있도록 헤더 전용 라이브러리로 작업하고있는 라이브러리를 패키지하고 싶습니다. (작고 별도의 번역 장치에 넣을 이유가 없습니다) 그러나 C ++의 하나의 정의 규칙을 위반하기 때문에 코드를 헤더에 넣을 수는 없습니다. (도서관 헤더가 클라이언트 프로젝트의 여러 번역 단위에 포함되어 있다고 가정)

라이브러리가 헤더 전용으로 라이브러리를 어떻게 수정합니까?

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 inline 예어:

// header.hpp (included into multiple translation units)

void foo_bad() {} // multiple definitions, one in every translation unit :(

inline void foo_good() {} // ok :)

inline 링커가 단순히 하나의 정의를 선택하고 나머지를 버릴 수 있습니다.

(따라서, 그 정의가 실제로 일치하지 않으면, 당신은 정의되지 않은 행동의 좋은 복용량을 얻습니다 ...!)


따로, 클래스 타입 내에 정의 된 멤버 기능은 암시 적으로 표시됩니다. inline:

struct myclass
{
    void i_am_inline_implicitly()
    {
        // because my definition is here
    }

    void but_i_am_not();
    void neither_am_i();
};

inline void myclass::but_i_am_not()
{
    // but that doesn't mean my definition cannot be explicitly inline
}

void myclass::neither_am_i()
{
    // but in this case, no inline for me :(
}

다른 팁

Liz가 제안한대로 헤더 가드를 사용하고 기능 방법보다 "인라인"을 넣는 것을 잊지 마십시오.

#ifndef MY_HEADER_H_
#define MY_HEADER_H_

inline RetType FunctionName( ParamType1 param1, ParamType2 param2 )
{
    // Function body
    return retType;
}

#endif

또한 헤더 전용 라이브러리 코드에서 글로벌 변수 또는 정적 변수를 사용하지 않아야한다고 생각합니다.

한 곳에서 컴파일하는 부품에 헤더 가드를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top