기초지식

05-3. 전처리기

로만주 2023. 5. 11. 23:42

▶ 전처리기

 

- 실행 파일을 생성하는 과정에서 컴파일 하기 직전, 소스 파일 내에 존재하는 선행 처리 지시문을 처리하는 작업을 의미한다.

 

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

ㄴ 지시자는 #을 시작으로 줄 바꿈으로 끝나는 코드

 

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

 

▷ 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