1 답변
-
C++ 컴파일 과정
C++을 컴파일하는 과정은 크게 2가지로 나눌 수 있습니다.
첫 번째는
source text
파일을binary object
파일(.OBJ
/.O
)로 컴파일하는 것이고, 두 번째는 모든object
파일을 link해 실행 가능한 binary파일을 만드는 것입니다.첫 번째 과정에서는
- 헤더 파일을 include하지 않은 경우: CPP파일만 컴파일합니다.
- 헤더 파일을 include한 경우는 관련: CPP파일이나 library가 같이 컴파일됩니다.
CPP파일들은 서로서로 독립적으로 컴파일됩니다.
그래서 다음과 같이 A.CPP에 B.CPP파일에서 정의한
symbol
을 쓰면 A.CPP는 B.CPP파일에 해당symbol
이 있는지 알 수 없으므로 컴파일되지 않습니다.// A.CPP void fncA() { fncInB(); // B.CPP에 정의된 함수 } /**************파일구분****************/ // B.CPP void fncInB() { // 어떤 코드 }
이 문제를 해결하려면 A.CPP에 해당 symbol을 선언해 줘야 합니다.
// A.CPP void fncInB() ; // B.CPP의 fncInB()선언 /**************파일구분****************/ void fncA() { fncInB() ; // B.CPP에 정의되어 있음 }
C.CPP에서도
fncInB()
를 쓰려면 어떻게 해야 할까요? 이 역시 마찬가지로 C.CPP에fncInB()
를 선언해주면 됩니다.CPP파일이 아주 많은 경우엔?
서로 다른 10개의 CPP파일이 모두
fncInB()
를 쓴다고 하면 10개의 CPP파일에 한 번씩 총 10번 선언해야 할까요?fncInB1()
,fncInB2()
,fncInB3()
, ... 같이 함수가 더 많아지면 어떻게 해야 할까요?이런 코드는 유지/보수하기 힘들기 때문에 헤더 파일안에
fncInB1()
,fncInB2()
,fncInB3()
를 한 번씩 선언한 뒤 각 CPP파일에서 헤더 파일을 include하는 방식을 씁니다.컴파일러가 include를 처리할 때 해당 파일의 내용이 그 위치에 대신 들어가기 때문에 프로그래머가 직접 복사-붙여넣기 하지 않고 컴파일러에게 그 일을 대신시키는 것이지요.
// B.HPP - 헤더파일 void fncInB() ; //함수를 선언 /**************파일구분****************/ // A.CPP #include "B.HPP" void fncA() { fncInB() ; // B.CPP에 정의된 함수 } /**************파일구분****************/ // B.CPP #include "B.HPP" void fncInB() { // 어떤 코드 } /**************파일구분****************/ // C.CPP #include "B.HPP" void fncC() { fncInB() ; // B.CPP에 정의된 함수 }
댓글 입력