C++ include style, 설명하면서 자연스럽게 linker와 preprocessor

2020. 9. 9. 01:39컴퓨터 수업/C++

@솔루션 -> 프로젝트 -> 소스코드 순으로 위계가 존재한다.

 

소스코드의 확장자는 주로 cpp인데.

 

보통 메인함수가 cpp에 존재한다.

 

따라서 cpp에서 헤더를 include 하므로

 

헤더에선 cpp를 include 할 필요가 없다.

 

*20200910 추가)

@정의와 선언

cpp에는 정의, h에는 선언이라 생각하자 (식별자 identifier) (인스턴스화 되기 전의 클래스)

 

class.h와 function.h가 존재한다고 생각해보자,

 

class.h에는 특정 class의 내용,  function에는 사용자 지정 함수 (not 멤버 함수)

 

@ 실제 사례

이때 main.cpp에는 구동 내용만 적으며 맨 위에 #include "class.h" , #include "function.h"

 

그리고 class.h에는 class의 identifier만 (데이터 멤버 선언하고, 멤버 함수의 원형만 선언) ,

 

function에는 사용자 지정 함수의 원형 prototype만 선언

 

그리고 class.cpp와 function.cpp에 각 메소드나 함수의 정의를 모두 수록하며

 

맨 위에 각. h를 include 한다. (ex. #include "class.h")

 

@좀 이상하지 않나

분명 #include ~~ 는 해당 자리에 해당 소스코드를 복붙 하는 것과 같이 기능한다고 배웠다.

 

반은 맞고 반은 틀렸다는 거지.

 

위계를 표현하자면,

 

이렇다는 건데,  그럼 뭐야, main에 전부 오는 게 아니라 여러 cpp 파일이 존재하는데? 아냐 그래도

 

한 프로젝트에 하나의 빌드니까 아직까진 할 수 있어.

 

라는 생각이 드는 게 당연하다.

 

따라서 위의 물리적 파일들은 다음과 같은 처리를 지난다.

 

 

여기서 add를 class나 function으로 생각하면 된다.

 

따라서 더 이상 순서가 중요해지지 않는다. (절차 지향적이 아님)

 

바로 객체지향적이여 지는 것이다.

 

cpp는 링킹 할 때 합해지고, h는 전처리기로써 인식되는 것이다.

 

따라서 만약 class.cpp에서 function.cpp의 내용을 갖다 쓰더라도 당연히 전처리기에서 class.h가 function.h의 존재를 파악했으니

 

런타임 에러가 발생하지 않는다.