▶ 코드를 실행가능한 프로그램으로 컴파일하는 과정
ㆍ 크게 순서는 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 순으로 진행된다
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 |