[ 빌드 과정 ]
1. 전처리 단계
소스 파일에 있는 #include, #define 같은 지시자, 지시문들을 처리한다.
전처리기의 출력은 컴파일러의 입력이 되며, 이 입력을 번역 단위 ( Translation Unit )라고 부른다.
2. 컴파일 단계
컴파일러는 주어진 번역 단위에 담신 C++ 소스 코드를 해석하여 어셈블리 코드로 변환한다.
어셈블리 코드에 대응되는 이진 기계어 명령들로 이루어진 이진 파일( 목적 파일, object file )을 출력한다.
3. 링크 단계
목적 파일들을 링크해 하나의 실행파일, 정적 라이브러리, 공유 라이브러리, 동적 라이브러리 파일을 만든다.
[ 문제점 ]
1. 반복된 치환 문제
전처리 단계에서 #include 지시문을 해당 헤더파일로 치환하는 과정에서, 중복된 헤더파일을 반복해서 치환하는 문제가 발생한다.
A.h < iostream > 헤더 추가
B.h < iostream > 헤더 추가
main.cpp < A.h, B.h, iostream > 헤더 추가
빌드 진행 시 < iostream > 헤더 파일이 세 번 치환되며, 번역 단위 및 컴파일 시간이 길어지는 문제가 발생한다.
2. 전처리기 매크로 문제
매크로를 포함한 순서에 따라 프로그램의 의미가 달라지며, 매크로가 프로그램의 기존 매크로나 식별자와 충돌하기도 한다.
A.h #define TEST 1
B.h #define TEST 2
매크로 TEST는 헤더 파일 순서에 따라 달라지며, 의존성 오류가 발생하게 된다.
3. 기호 중복 정의
C++ 에는 ODR ( One Definition Rule ) 단일 정의 규칙이 존재하며 함수에 대한 규칙은 다음과 같다.
- 임의의 번역 단위에 함수의 정의는 하나이어야 한다.
- 프로그램 안에서 함수의 정의는 하나이어야 한다.
프로그램이 이러한 ODR을 위반한 것을 중복 정의 ( multiple definition )라고 부르며, 링커는 이러한 중복 정의에 대해 링크 오류를 발생한다.
A.h void Test() {}
B.h < A.h > 헤더 파일 추가
main.cpp < A.h, B.h > 헤더 파일 추가
--------------중복 정의 링크 오류 발생--------------
기존 우회 방법 ( Header Gouard )
A.h
#ifndef TEST_
#define TEST_
void Test() {}
#endif
혹은
#pragma once 지시자 사용
'C++ > C++ 20' 카테고리의 다른 글
[C++ 20] 삼항 연산자 <=> (0) | 2022.02.20 |
---|---|
[C++ 20] 모듈 ( Module ) (0) | 2022.02.20 |
[C++ 20] 콘셉트 목록 정리 (0) | 2022.02.19 |
[C++ 20] three_way_comparable concept (0) | 2022.02.19 |
[C++ 20] Concepts 적용 방법 (0) | 2022.02.13 |