혼자 프로그래밍을 하는 경우는 한 파일 내에서 선언과 구현을 해버리는 경우가 많으나, 


일반적인 경우는 선언부와 구현부를 나눠서 각각 헤더 파일과 소스 파일에 작성하게 된다.


이는 라이브러리 형태로 배포하게 될 경우 소스는 배포하지 않아 구현을 숨겼더라도 헤더파일만 보고 해당 코드의 기능을 쓸 수 있기 위함이기도 하고, 소스를 배포하더라도 가독성을 위해서 필요한 것이다.


이때 주의해야 할 내용을 정리해 본다.



1. 인라인, 템플릿 등 컴파일 시간에 어셈블리 코드가 치환되는 경우, 헤더 파일에 구현과 선언이 같이 있어야 한다.


아래 구현을 보자.

<헤더파일>




<소스파일>



이 헤더파일을 include하고 Stack 클래스를 가져다 쓰면 잘 컴파일 될 것 같지만 에러가 발생한다.

(만일 이 코드가 template이 아니었다면 정상 동작한다)


이는 가져다 쓰는 쪽을 컴파일 할 때 컴파일러가 헤더 파일을 보고 template을 치환해야 하는데, 구현부의 소스파일은 이미 컴파일 된 상태이기 때문에 컴파일러가 치환할 수 없기 때문이다.


따라서 이 코드가 잘 동작하려면 소스파일 내용을 헤더파일 내부로 옮겨야 한다.


template의 경우 선언/구현 둘 다 키워드가 필요한데,

inline의 경우 inline 키워드는 선언부, 구현부 한 군데에만 있거나 두 군데에 있어도, 만일 둘 다 inline이 없어도 선언과 구현이 모두 헤더파일에 있으면 암시적으로 inline이 되는 것 같다. (링크)



2. 디폴트 파라미터를 사용하는 경우 선언부에만 적어주어야 한다.


디폴트 파라미터를 선언부와 구현부 모두에 쓰면 컴파일 에러가 발생한다.


디폴트 파라미터를 선언부에는 쓰지 않고 구현부에만 쓰는 경우,

컴파일러가 함수 호출시 선언부를 보고 함수 호출이 올바른지 체크하게 되는데, 

선언부에는 디폴트 파라미터를 쓰지 않았으므로 호출에 대해 인자가 모자라다는 에러를 내게 된다.

즉, 디폴트 파라미터를 쓸 수 없게 된다.




3. 정적 멤버 변수와 정적 멤버 함수


정적 멤버 변수의 경우 외부 선언은 구현 파일에 작성한다.


정적 멤버 함수의 경우 선언부에만 static 키워드를 넣고 구현부에는 넣지 않는다.

구현부에 static 키워드를 넣으면 C의 static 키워드가 된다.



4. 상수 멤버 함수


상수 멤버 함수의 const 키워드는 선언부와 구현부 모두 넣는다.


5. 가상 함수


가상 함수를 나타내는 virtual은 선언부에만 적는다. (구현부에는 X)

+ Recent posts