[C++] 분할 구현 & 문제점

꿈별·2023년 3월 7일
0

C++

목록 보기
8/27

메모리 영역

(a) 스택 영역

  • 특징)
    함수 호출 시 할당되고, 함수 종료 시 소멸

(b) 데이터 영역

  • 특징)
    프로그램 시작 시 생성, 프로그램 종료 시 해제

(c) ROM 영역(읽기 전용, ex-*코드)
(d) 힙 영역


✔분할 구현

  • 헤더 파일과 cpp 파일을 분리해서 구현하는 것
  • 헤더 파일에서는 함수 선언만!
  • 정의는 cpp 파일에서 한다. cpp 파일은 헤더 파일을 참조한다.
[func.h]
//선언
int Add(int a, int b);
[func.cpp]
//정의
#include "func.h"
int Add(int a, int b)
{
	return a+b;
}

💡 main()에서 위 함수를 사용하고 싶다면, 해당 파일에서 func.h 파일을 include하면 된다.
(실제 구현 내용은 func.cpp에 있지만, 링크 단계에서 합쳐지므로 문제없음)

#include : 전처리 지시자. 전처리 단계에서, 포함(include)된 파일의 내용을 지시자의 위치에 그대로 복사한다.

  • #include <filename>
    <> 는 컴파일러에서 제공하는 기본 헤더 파일을 include할 때 사용한다.
  • #include "filename"
    ""는 소스 파일이 있는 디렉터리에서 헤더 파일을 include하도록 전처리기에게 지시한다.
    보통 자신이 직접 작성한 헤더 파일을 include할 때 이 방법을 쓴다.

분할 구현하는 이유

  • 손쉬운 코드 관리
  • 재사용이 용이해짐

[참고] 지역 / 전역 변수 포스트

❗분할 구현의 문제점

  • 메인 파일에서 전역 변수를 선언하더라도, 다른 파일에서는 이 전역 변수의 존재를 알지 못한다.
  • 물론 최종적으로 코드가 하나로 합쳐졌을 때(링크 단계)는 프로그램 데이터 영역에 그 변수가 존재하게 되지만,
  • 개발하는 과정에선 다른 파일의 전역 변수를 인식할 수 없으므로 문법 오류가 발생한다.

🤔 헤더 파일에 정의까지 다 해버리면 안 될까?
-> 할 수는 있지만 링크 단계에서 문제 발생

  • [LNK2005], [LNK1169] 중복 정의 문제,
    여러 파일에서 #include로 헤더 파일 복사해올 때, 모든 파일에 구현 부분이 복붙됨.
    링크 과정에서 하나의 프로그램이 되기 위해 모든 파일이 합쳐질 텐데. 이 때 함수가 중복 정의되어 버린다.

💡 해결


[참고]
https://youtu.be/ckwQxpWKjxs
https://boycoding.tistory.com/145

0개의 댓글