Programming Language/C/C++

[C++] export와 클래스 템플릿, 헤더 파일 나누기

깐요 2017. 7. 14. 15:41

export와 클래스 템플릿

템플릿들은 클래스와 멤버 함수 정의가 아니다

클래스와 멤버 함수 정의를 생성하는 방법을 컴파일러에게 알려 주는 지시문이다

템플릿들은 함수가 아니기 때문에 개별적으로 컴파일할 수 없다

따라서 특별한 구체화 요구들과 함께 결함하여 사용해야 한다

보통 모든 템플릿 관련 정보를 헤더 파일에 집어 넣고, 그 템플릿들을 사용하는 파일에 그 헤터 파일을 포함시키는 것이다


하지만 위와 같은 방법은 코드가 깔끔해보이지 않을 수 있다

템플릿이 아닌 클래스의 경우 cpp 파일을 따로 나누어 함수 정의를 구현한다

템플릿 클래스의 경우는 export 키워드를 이용하여 그것이 가능하다

...
export template <typename T>
class nameclass
{
    ...
}; 
...

주의할 점은 export 키워드를 지원하지 않는 컴파일러에서 템플릿 멤버 함수들을 별개의 구현 파일에 넣으면 바르게 동작하지 않는다

그렇기에 권장되는 방법은 아니다

//header.h
template <typename T>
class CTP
{
  ...
}

//headerTPs.h
#include <header.h>

template <typename T>
CTP<T>(...) { ... }

template <typename T>
CTP<T>::method1(...) { ... }
...

//test.cpp
#include <headerTPs.h>

int main()
{
  ...
}

이럴 때에는 헤더 파일을 둘로 나누면 가능하다

위 코드와 같이 클래스 템플릿 헤더 파일(1)과 템플릿 멤버 함수를 구현한 헤더 파일(2)로 나누면 코드가 깔끔해진다

헤더 파일(2)에 헤더 파일(1)은 선언해주고 템플릿들을 사용하는 파일에 헤더 파일(2)를 포함시키면 된다


inline 메소드

인라인 함수들은 내부 링크를 가진다

따라서 함수 정의가 그 함수를 사용하는 파일 안에 들어 있어야 한다

인라인 정의들이 헤더 파일에 있다면 그 정의를 사용하는 파일에 헤더 파일을 포함시키는 것으로 해결된다

inline 키워드를 제거하여 그 함수들이 외부 링크를 갖게 한다면 별개의 구현 파일에 넣을 수도 있다

320x100