C++프로그래밍/C 와 C++ 기초실습

컴파일 과정과 전처리기

season97 2023. 10. 9. 20:52

▶ 코드를 실행가능한 프로그램으로 컴파일하는 과정

 

c/c++ 컴파일 과정

ㆍ 크게 순서는 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 순으로 진행된다

 

1. 전처리기

 

ㆍ include나 define 같은 전처리기 지시문을 처리한다.

 

ㆍ 필요한 헤더 파일을 포함시키고 매크로를 적용하며 #ifdef나 #endif와 같은 조건부 컴파일에 따라 일부 코드를 제거하는 등의 작업이 수행된다.

 

2. 컴파일러

 

ㆍ 전처리된 소스코드가 실제로 컴파일 되는 단계

 

ㆍ c++소스코드를 중간 코드나 어셈블리어로 변환하고 그 후에 어셈블 과정을 거쳐서 오브젝트 파일을 생성함

 

ㆍ 이 과정에서 여러 단계를 거쳐서 타깃 플랫폼에 맞는 언어(대게 어셈블리어)로 변환함.

 

3. 어셈블러

 

ㆍ 컴파일러가 생성한 어셈블리어 코드를 기계어로 변환하는 역할을 한다.

 

ㆍ 결과물인 오브젝트 파일은 실행 가능한 바이너리가 아니며 링크단계를 필요로 한다.

 

4. 링커 

 

ㆍ 링커는 여러 개의 오브젝트 파일과 라이브러리들을 하나의 실행 가능한 바이너리 파일(exe)로 결합한다.

 

 

 

 

 

 

 

 

▶ 전처리기?

 

ㆍ 실행 파일을 생성하는 과정에서 컴파일 하기 직전,

소스파일 내에 존재하는 선행처리 지시문을 처리하는 작업을 의미한다.

 

ㆍ 전처리기가 실행되면 각 코드 파일에서 전처리기 지시자를 찾기 시작한다.

 

ㆍ 선행처리를 위한 명령어에는 맨 앞에 #기호가 붙는다는 공통점이 있다.

 

※ 종류 

 

1. #include

 

헤더파일 또는 다른 소스 파일을 현재 코드파일에 포함시킴

 

2. #define

 

ㆍ 매크로를 정의,  주로 상수를정의하는데 사용되지만 함수와 유사한 매크로도 만들 수 있다.

 

 

3. #undef

 

ㆍ #define으로 정의된 매크로를 해제

 

4. #if , #else, #elif, #endif

 

ㆍ 조건부 컴파일을 수행하는데 사용됨. 특정 조건이 참인 경우에만 코드를 컴파일한다

 

과제를 관리하기도 편리하다.

 

5. #ifdef, #ifndef

 

ㆍ 조건부 컴파일을 수행하지만 매크로가 정의되어 있는지 아닌지를 체크하는데 사용

 

6. #error, #pragma

 

ㆍ error 지시자는 명확한 에러 메세지와 함께 컴파일 오류를 발생시킴

 

ㆍ pragma 지시자는 컴파일러에 따라 다르게 동작하는데 보통 최적화설정 등을 활성화 하는데 사용됨

 

 

 

 

 

 

#define 키워드로 매크로화 vs 상수 효율?? 

 

ㆍ 컴파일시간, 메모리 사용량 등등에선 리터럴 상수를 사용하는게 압도적으로 좋다.

 

ㆍ 하지만 그럼에도 불구하고 #define으로 매크로화 시키는이유는?

-  PI를 예시로 들어보자.  -

1. 가독성 : 3.14라는 숫자보다 PI라는 이름을 사용하는 것이 코드의 의미를 더 명확하게 전달할 수 있다.

협업 시 코드를 처음 보는 사람도 해당 값이 무엇을 의미하는지 쉽게 이해 가능하다

 

2. 유지 관리: 만약 원주율의 값을 3.14가 아닌 더 정확하게 표현하고싶어서 값을 3.14159로 변경하려고 하면

모든 3.14를 찾아서 바꾸는 것은 번거롭고 오류가 발생할 여지가 있다. 매크로를 사용했다면 PI라는 매크로값만 변경해

주면된다.

 

3. 일관성 : 같은 값인데도 불구하고 어떤곳에선 3.14 어떤곳에선 3.14159 어떤곳에선 다른 근사치를 사용한다면

혼란스러울 수 있다

 

 

▶ 매크로 상수를 정의할 때 주의점

 

#define 문은 코드를 생성하는 명령이 아니며 매크로의 이름도 일종의 명칭이기 때문에 규칙에 맞게 작성해야 한다

 

ㆍ 매크로 표기법은 대문자를 쓴다. 띄어쓰기는 _로 표기한다 (스테이크)

 

ㆍ 매크로 이름에는 공백이 들어갈 수 없지만 매크로 실제 값에는 공백을 가질 수 있다.

ex )  #define MSG "공부화이팅"

 

ㆍ 문자열 상수 내에 있는 매크로나 다른 명칭의 일부로 포함된 경우는 치환되지 않는다.

 

ㆍ 매크로는 중첩이 가능하다.

매크로 중첩

ㆍ 값을 가지지 않는 빈 매크로도 정의 가능

빈 매크로 정의

 

ㆍ 매크로 상수는 단순히 컴파일 전에 코드를 튜닝하기 위한 전처리기에 의해 처리되는 상수이기 때문에

컴파일러 입장에서는 리터럴 상수와 동일시된다. (컴파일러는 매크로 상수의 존재를 알 수 없다는 뜻)

'C++프로그래밍 > C 와 C++ 기초실습' 카테고리의 다른 글

bool과 부동소수점  (1) 2024.09.15
정수  (0) 2024.09.15
변수와 상수 영역과 Lifecycle  (0) 2023.10.09
상수  (1) 2023.10.09
함수  (1) 2023.10.09