본문 바로가기
개념공부/C, C++, IDE

C - 매크로와 선행처리기

by Zach Choi 2021. 12. 2.
728x90
반응형

확실히 코딩 및 컴퓨터 언어는 직접 짜보고 사용하는 것이 가장 좋은 공부법인 것 같다. 프로그램을 개발하지 않고 백준 문제만 풀 때는 책으로 공부한 C언어의 내용들이 오래 기억에 남지도 않고 이해도 잘되지 않았다. 그런데 입사 후 C로 프로그램을 만들면서 C언어 책을 보니, 작성했던 코드들과 책 내용이 연계되면서 이해가 잘 된다.

▶ 선행 처리기

소스코드는 컴파일과 링크를 통해 실행프로그램이 생성된다. 그런데 컴파일 이전에 선행 처리 과정이 존재한다. 선행 처리하는 주체가 선행 처리기이다. 선행 처리는 소스코드에 작성해놓은 선행 처리 명령문이 단순 치환되는 과정이다. 선행 처리 명령문은 #문자로 시작하고, 명령문 마지막에 세미콜론을 작성하지 않는다.

ex) #define A 0

습관적으로 작성했던 #define <stdio.h> 도 선행 처리 명령문이다. 이 명령문은 선행 처리기에 의해 stdio.h의 내용들이 해당 명령문과 치환된다.

▶ 단순 치환, 함수 역할을 수행하는 매크로

지금까지 선행처리문은 단순한 값 치환을 목적으로 사용해왔다.

ex) #define NUM_OF_PNTS 10

그런데 단순치환된다는 특징을 이용해서 함수와 같이 이용 가능하다.

ex) #define CAL_AREA_CIRCLE(X) X*X

X로 전달된 매개변수가 선행 처리 몸체에 대입된 상태로 명령문과 치환된다.

이때 괄호를 잘 사용해야 한다.

CAL_AREA_CIRCLE(1 + 2)의 경우, 우리가 기대하는 결과는 9이지만 실제로는 5가 출력된다.

그 이유는 1 + 2 * 1 + 2로 치환되기 때문이다. 따라서 괄호를 사용해 아래와 같이 작성해야 한다.

ex) #define CAL_AREA_CIRCLE(X) (X*X)

▶ 매크로를 두 줄로 쓸 때

기본적으로 매크로는 한 줄에 정의하는 것이 원칙이기 때문에, 임의로 줄을 변경하면 에러가 발생한다.

여러 줄로 작성할 때는 역슬래쉬 문자를 활용해 줄이 바뀌었음을 명시해야 한다.

▶매크로는 먼저 정의된 매크로를 사용 가능하다.

ex)

#define ADD(X, Y) (X + Y)

#define MUL(X, Y) (ADD(X, Y) * ADD(X, Y))

▶매크로의 장점과 단점

장점 1: 간단하고 자주 호출되는 수식이라면 매크로를 사용하여 실행 시간을 줄일 수 있다.

장점 2: 매크로는 단순 치환이기 때문에 자료형에 따라 별도 함수를 작성하지 않아도 된다.

단점 1: 함수가 복잡하면 정의하기 까다롭다.

단점 2: 디버깅이 어렵다.

따라서 간단하고 자주 호출되는 함수 and 값을 매크로로 자주 활용한다.

▶조건부 컴파일을 위한 매크로

#if - #endif : 조건부 코드 삽입을 위한 지시자

#ifdef - #endif : #ifdef는 해당 매크로가 정의 여부를 기준으로 동작한다.

#ifndef - #endif : #ifndef의 n 은 not을 의미한다.

#if - #endif 사이에 #else를 추가하여 매크로 그 외 조건문을 추가할 수 있다.

#elif : #if - #else - #endif 외에 추가로 매크로 조건문을 추가할 때 사용.

728x90
반응형

'개념공부 > C, C++, IDE' 카테고리의 다른 글

[C++] Unordered Map (작성 중)  (0) 2023.01.08
[C++] vector container  (0) 2023.01.06
qsort  (0) 2023.01.02
[C/C++] 정수를 문자열에 저장하는 법, sprintf  (0) 2022.06.23
VSC, Git, Github 유튜브 영상  (0) 2021.07.26