C++ 전처리 지시자

2021. 8. 16. 10:47C++

728x90

// include(전처리 지시자)

1. 개요

- 지정한 파일의 내용을 불러와 지시자(include)가 있는 위치에 붙여놓는다.

2. 사용법

#include <파일명> or #include "파일명"

-> 붙여넣을 파일명 꺾쇠괄호나 큰 따옴표로 묶는다.

3. 꺾쇠괄호와 큰따옴표의 구분

- 꺾쇠괄호 : 컴파일러가 설정한 include 디렉토리에서 찾는다.

- 큰따옴표 : 소스 파일이 저장된 디렉토리에서 먼저 찾는다.

4. 특징

- 프로그램을 깔끔하고 편하게 작성할 수 있다.

- 하나의 프로그램은 독립적으로 컴파일이 가능한 파일 단위인

모듈(module)로 나누어 분할 컴파일한다.

- 각 모듈이 같이 사용하는 구조체나 함수 또는 전역 변수의 경우,

각 선언을 하나의 헤더 파일로 만들면 필요한 모듈에서 쉽게 포함하여

쓸 수 있다.

- 헤더 파일의 내용이 수정되더라도 컴파일만 다시 하면

수정된 내용이 모든 파일에 동시 적용되므로 빠르고 정확한 빌드가 가능하다.

2.define

1) 개요

- 매크로(이름)를 만드는 전처리 지시자

2) 사용법

#define [매크로명] [치환될 부분]

-> 다른 변수명과 쉽게 구분할 수 있도록 관례상 대문자로 표기

3) 장점

- 자주 사용하는 복잡한 상수나 문자열을 의미 있는 단어로 치환할 수 있다

- 매크로를 정의할 때 치환될 부분이 너무 긴 나머지,

여러 줄에 나눠서 써야할 경우엔 백슬래시(\)로 연결할 수 있다.

4) 단점

- 문제(=버그)가 발생하면 매크로가 어떤 형태로 치환되는지

다시 확인해야 하므로 디버깅과 유지보수가 힘들다.

- 컴파일러는 전처리가 끝난 후에 치환된 소스 코드로 컴파일하고,

사용자는 매크로로 작성된 소스 코드를 보게 되므로

컴파일러가 표시하는 에러 메시지를 소스 코드에서 즉시 확인하기 힘들다.

=================================

보충

=================================

* 매크로 함수 (define function)

1) 개요

- 전달받는 인수에 따라 서로 다른 결과를 갖도록 치환하며, 함수처럼 사용할 수 있다.

2) 사용 방법

# define [매크로 함수명(인수)] [치환될 부분]

-> 매크로명 뒤에 괄호를 열고 인수를 나열한다.

3) 사용 상의 주의점

- 치환된 후의 부작용을 줄이기 위해서 치환될 부분에 괄호를 써서 정의한다

[예시1]

#define MUL(a,b) a * b

result = 30 / MUL(2,5)

전처리 후 -> result = 30 / 2 * 5;

해설) 전처리가 끝나고 치환된 코드에서 연산 순서가 뒤바뀜

때문에 값이 3이 아니라 75가 됨

[예시1]

#define MUL(a,b) (a * b)

result = 30 / MUL(2,2+3)

전처리 후 -> result = 30 / (2 * 2 + 3);

해설 ) 곱셈을 먼저 수행하여 7이 계산되고,

이후 30을 7로 나눈 몫 4가 최종 값이 된다.

결국 부작용을 최소화하기 위해 치환될 부분을 구성하는

모든 인수에 괄호를 적용하는 것이 그나마 오류를 최소화하는 방법

4) 장점

- 호출한 함수로 이동할 때 필요한 준비작업이 없다.

- 상대적으로 실행 속도가 빠르다.

- 크기가 작은 함수를 자주 호출한다면 매크로 함수가 좋은 대안.

5) 단점

- 함수처럼 쓰이는 전처리 지시자이지만 치환된 후 발생할 문제를 예측하기 어렵다

많은 기능을 매크로 함수로 구현하기는 힘들고, 수정하기도 쉬운 일이 아니다.

4. 매크로 연산자 #과 ##(define operator)

1) 정의

- 매크로 함수의 치환될 부분에서 사용하는 연산자

2) 종류

(1) # : 인수를 문자열로 치환

(2) ## : 2개의 토큰(token)을 붙여서 하나로 만드는 연산

※ 토큰 : 프로그램에서 독립된 의미를 갖는 하나의 단위

728x90

'C++' 카테고리의 다른 글

C++ 소소한 에러 / 콘솔창 / SDK 버전  (0) 2021.08.16
C++ 조건부 컴파일  (0) 2021.08.16
C++ STL  (0) 2021.08.14
C++ PlaySound  (0) 2021.08.14
C++ 클래스와 정보은닉  (0) 2021.08.12