문제
고객이 더 쉽게 사용할 수 있도록 헤더 전용 라이브러리로 작업하고있는 라이브러리를 패키지하고 싶습니다. (작고 별도의 번역 장치에 넣을 이유가 없습니다) 그러나 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
또한 헤더 전용 라이브러리 코드에서 글로벌 변수 또는 정적 변수를 사용하지 않아야한다고 생각합니다.
한 곳에서 컴파일하는 부품에 헤더 가드를 사용하십시오.
제휴하지 않습니다 StackOverflow