▶ 전처리기
- 실행 파일을 생성하는 과정에서 컴파일 하기 직전, 소스 파일 내에 존재하는 선행 처리 지시문을 처리하는 작업을 의미한다.
- 전처리기가 실행되ㅕㄴ 각 코드 파일에서 지시자를 찾기 시작한다.
ㄴ 지시자는 #을 시작으로 줄 바꿈으로 끝나는 코드
※ 선행 처리를 위한 명령에는 맨 앞에 # 기호가 붙는다는 공통점이 있다.
▷ C / C++ 코드를 실행하는 과정
- 순서 : 전처리기 -> 컴파일러 -> 어셈블러 -> 링커
전처리기 (Preprocessor)
ㄴ 헤더 파일 삽입, 코드의 주석 제거, 문법 검토, 매크로 등을 치환하는 역할을 수행한다.
컴파일러
ㄴ 어셈블리 파일로 변환을 해준다.
어셈블러
ㄴ 어셈블리 코드를 기계어(0 or 1) 변환하여 오브젝트 파일을 생성한다.
링커
ㄴ 각각의 오브젝트 파일들을 묶어서 실행 코드 파일로 변환을 해준다.
- 좀 더 쉽게
1. 내가 작성한 소스파일은 먼저 소스파일 처리를 하는 선행 처리를 거치고
2. 컴파일 되어
3. 오브젝트 파일이 생성되고
4. 링커에 의한 실행파일이 된다.
- 더 쉽게
ㄴ [소스 코드] -> [바이너리] -> [실행 파일]
▶ 선행처리를 위한 명령
- 전처리기문 == 전처리기 연산자
- 파일 처리를 윟나 전처리기문
-> 최적화
1. #include
ㄴ #include <파일 이름> -> 미리 정의 된 include 폴더에서 파일을 찾는다.
ㄴ #include "파일 이름" -> 현재의 소스 코드가 저장되어 있는 폴더(디렉토리)에서 먼저 찾고 파일이 없다면 미리 정의된 include 폴더에서 파일을 찾는다.
- 형태 정의를 위한 전처리기문
◇ 면접에 자주 나오는 질문
1. #define
ㄴ #define 키워드는 매크로 상수 또는 매크로 함수를 정의하는 역할을 한다.
ㄴ C# 도 지원은 하지만 내부 구조적으로 싫어한다.
2. #undef
- 매크로 해제
3. 조건부 컴파일을 위한 전처리기문
- #if, #ifdef, #ifdef, #else, #elif, #endif
ㄴ C언어로 객체 지향 프로그래밍을 하려면 써야 될 걸? 이라고 물을만한 전처리기문들.
ㄴ #ifdef : 식별자가 정의되어 있으면 참
ㄴ #ifndef : 식별자가 정의되어 있지 않으면 참
ㄴ #endif : 전처리기 부분을 종료 (#if 시리즈)
★ 코드 설계 단계에서 적용을 잘 하면 실행 속도에 매우 큰 이득을 얻을 수 있다.
ㄴ 선택적 컴파일 기법
▶ pragma
- 컴파일러의 기능을 확장 시킬 수 있게 나온 문법이며 어떤 동작을 정해주기 위해 사용한다.
ㄴ C#에 존재하지 않음, 그래서 C#은 컴파일러가 존재하지 않음.
ㄴ C / C++의 전유물로 여겨짐
※ 컴파일러의 버전에 따라 동작 여부가 결정된다.
ㄴ 덤으로 OS에 따라서도 동작 여부가 결정된다.
#pragma region 이름 [대분류]
- 코드를 개요, 축소가 가능하게 묶는다.
#pragma endregion [부가 설명]
#pragma once
ㄴ 헤더 파일 중복 방지
ㄴ 링크 할 때 헤더 파일이 한번만 포함되게 한다.
ㄴ 헤더파일이 흩어져 있어도 한번만 가져오게 해 컴퓨터가 예외처리로 어시스트 해줌.
#pragma message ("Example_07.cpp 절대 수정하지 말 것")
ㄴ 컴파일 시 출력창에 메시지 출력
ㄴ 주로 협업 시 개발자에게 경고를 알려줄 때 사용한다.
ㄴ 경고일 뿐이라 강제성은 없어 사용에 주의
▶ 매크로 상수를 정의 할 때 주의점
1. #define문은 코드를 생성하는 명령이 아니며 매크로의 이름도 일종의 명령이기 때문에 규칙에 맞게 작성해야 한다.
※ 매크로의 표기법은 대문자 표기법을 쓴다.
ㄴ 띄어쓰기는 _언더바로 표기한다. -> 스네이크
2. 매크로 이름에는 공백이 들어 갈 수 없지만 매크로 실제 값은 공백을 가질 수 있다.
ㄴ Ex) #define MSG "똑바로 공부하자"
3. 문자열 상수 내에 있는 매크로나 다르 명칭의 일부로 포함된 경우는 치환되지 않는다.
4. 매크로는 중첩 가능
ㄴ Ex) #define A 3
ㄴ Ex) #define B (A * 3)
5. 값을 가지지 않는 빈 매크로도 정의 가능
ㄴ Ex) #define AAA
ㄴ 위 매크로를 해석하면 값을 가지고 있지 않으며 매크로 상수 자체만 존재한다.
6. 매크로 상수는 단순히 컴파일 전에 코드를 튜닝하기 위한 전처리기에 의해서 처리되는 상수이기 때문에 컴파일러 입장에서는 리터널 상수와 동일 시 된다.
ㄴ 리터널 상수와 동일 시 -> 컴파일러는 매크로 상수의 존재를 알 수 없다.
- 매크로 표기법
ㄴ 상수의 이름은 모두 대문자 -> 스네이크 표기법
- 매크로 정의 방법
ㄴ 매크로는 대문자 단어의 끊음은 언더바이다. (개발자들의 약속)
-
'기초지식' 카테고리의 다른 글
06-2. 난수 + 셔플 (0) | 2023.05.13 |
---|---|
06-1. 배열 (0) | 2023.05.11 |
05-2. 변수 / 상수 (0) | 2023.05.11 |
05-1. 함수 +변/상수 (0) | 2023.05.09 |
04. 조건문 (0) | 2023.05.09 |