CPP_어소_24_분할 구현 문제점

CJB_ny·2022년 5월 23일
0

CPP_AROTHO

목록 보기
22/83
post-thumbnail

헤더에 변수 선언 후 include하면 어떻게 될거같나?

싹다 복사됨


분할 구현 문제점

그러면 헤더에다가 선언과 정의를 하면되지

왜 이렇게 헤더에다가는 선언만 해놓냐?? 이게 의문일 수 있다.

헤더 파일에다가 Add함수를 구현하고 다른 cpp 파일에서 #inlcude(전처리기)를 통해서
모든 기능을 복붙을 하게 되는데 이러면 컴파일을 하고 마지막 링크 단계에서
같은 함수가 3개가 되겠네??

같은 함수가 2개 이상이면 이미 명시되어있다고

이렇게 뜬다. (같은게 있다고)

그래서 이런 (함수가 중복이 되는 문제가 발생을 한다)

그래서

헤더파일에는 선언만 해둔다.

include 하면서 Add라는 애가 "있다" 라는 정보만 받아간다.

그래서 include한 애들이 Add를 호출을 할 것이다.

이 작업은 컴파일러가 문제 삼지 않는다.

그리고 실제 구현되어 있는 부분은 CPP.cpp라는 파일에 있을 테니까

링크 단계에서 그쪽으로 "링크"가 되는 것이다.


구현한 파일들

그래서 Add함수를 호출하면

이 안에는 내가 작성한 코드가

다 합쳐져서 "어셈블리 언어"로 "바이너리 화" 되어서 "하나로 합쳐"졌다.

이 안에는 CPP_study.cpp, func.h, func.cpp 가 다 합쳐져셔 들어간 것이다.

그래서 func.obj 안에는

내가 실제로 구현한

이녀석이 들어가 있을 것이다.

전역변수 문제

우리가 cpp_study.cpp에 전역으로 선언해준 g_i 라는 변수는

프로그램을 실행시키면 "데이터 영역"에 g_i 라는 녀석이 분명히 존재를 하지만

다른 파일에서는 이녀석이 있는 줄 모르는 문제가 발생을 한다.

"컴파일러"는

지금 해당 파일에서만 문법적으로 오류가 있는지 없는지 보고있기 때문에

g_i라는 녀석의 존재 자체를 모름. (그게 누구임?)

CPP에서는 이런 문제를 해결 하기 위한 방법을 제공 하지 않을까?

왜냐하면 전역변수는 프로그램이 실행되는 내내 계속 살아 있을 테니까 (데이터 영역에서)

그럼 헤더 파일을...??

(나도 이렇게 생각하기는 했다)

이런식으로 다 ,include를 통해 참조를 하면되지 않을 까??

그런데!

#include의 기능을 정확히 몰랐던 것이다. 이러면

#include는 단순히 복붙이다!

이렇게되면 또 함수를 설명할 때와 똑같은데

이렇게하면 모든 파일마다 전역변수가 하나씩 선언되지 않나??!!

그런데 각각의 파일 단위로 컴파일 할때는 문제가 있을까 없을까?

없다!

-> 개별적은 obj파일까지는 문제가 없는데

어디서 문제가 생기냐면 "링크 단계"에서 문제가 생긴다.

이렇게 선언을 해주면

이 헤더파일을 include한 녀석들은 이 전역변수를 이제 알겠구나! 가 아니다.

헤더파일에 num 이라는 전역변수를 선언을 하고 func.cpp, cpp_study.cpp에서

각각 num이라는 헤더파일에 초기화된 변수를 사용하였을 경우 이렇게 된다.

그리고 에러를 보면

"링킹 단계" 문제임.

그리고 잘 읽어보면

CPP_study가 먼저 실행이 되서 obj파일 만들고 나서 func.cpp를 컴파일을 해서

func.obj파일을 만들려고 하다보니까

링크단계에서 CPP_study.cpp에서 이것이 있다고 중복이 된 것을 링킹 단계에서 확인을 하고 에러 난 것이다.

해결하기 위한 방법

정적 변수

외부 변수

다음 시간에 ㄱㄱ

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글