본문 바로가기
프로그래밍/C || CPP

[C | C++] #define 매크로 상수, 함수 정리

by _BlankSpace 2018. 5. 10.

1. #define 매크로란?


C나 C++ 관련 책을 보게 되면 #define이라는 것을 본 경험이 있을 것이다.

#define 은 매크로를 정의할 때 앞에 써주는 키워드라고 생각하면 되겠다.


매크로는 프로그램 내에서 컴파일러가 매크로를 만났을 때, 대체할 문자열을 정의하는 것을 말한다.

이러한 매크로는 컴파일러가 컴파일을 시작하기 전에, 전처리가 #define으로 정의된 기호상수 등을 확장 문자열로 변환시키는 동작을 한다.


그럼, 매크로에 대해서 자세히 알아보도록 하자.


2. 매크로 상수, 매크로 함수를 알아보자.


위에서 매크로가 무슨 기능을 하는 것인지는 알아봤으므로, 어떤 형식으로 이루어졌는 지 알아보자.


1

2

#define [매크로 상수명] [매크로 확장 문자열]

#define [매크로함수명(전달인자)] [매크로 확장 문자열]

cs



크게 두 가지로, 매크로 상수 매크로 함수가 있다.

먼저,. 매크로 상수는 미리 정의한 매크로 상수명이 쓰이면, 매크로 확장 문자열로 치환을 한다.

그리고, 매크로 함수는 전달인자의 형태를 고려해서 치환하는 동작을 한다.


그럼, 매크로 상수의 예를 보자.

1
2
3
#define TODAY 20180509
#define STR "Example String"
#define PRN printf("print\n")
cs

매크로명은 보통 대문자로 쓰인다. 이것은 굳이 지킬 필요는 없지만, 대부분의 코딩스타일에서 대문자로 정해져있을 것이다.

위의 3가지 예를 보면, 숫자든 문자든 printf 함수든 자유롭게 정의할 수 있는 것을 볼 수 있다.


이처럼, 매크로는 프로그램의 가독성을 높여주고, 유지보수도 용이하게 해준다. 또한, 변수를 사용하는 것보다 처리속도도 빠르다.


다음으로는 매크로 함수의 예를 보자.

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#define DOUBLE(x) (x * x)
 
int main(void)
{
    int num = 5;
    printf("num = %d, num * num = %d\n", num, DOUBLE(num));
    return 0;
}
cs

위의 예에서는 DOUBLE(x)로 x를 인자로 받는 매크로 함수를 정의하였다.

이처럼, 인자를 이용하여 x * x 처럼 자신이 원하는 내용대로 정의할 수 있다.


3. 매크로 함수의 주의사항


매크로 함수를 정의할 때 주의할 점이 있다.


먼저, 괄호가 있고, 없고의 차이다. 아래 예를 보자.

1
2
#define PLUS 2 + 5
#define PLUS (2 + 5)
cs

둘의 차이는 괄호의 유무다. 이것은 큰 차이를 보인다.

예를 들어, PLUS를 다음과 같이 사용했을 때를 생각해보자.

PLUS * 5 -> 1번일 경우, 2 + 5 * 5 -> 즉, 27 이라는 값이 나온다. 반면에 2번일 경우에는 (2 + 5) * 5 -> 35라는 값이 나온다.


또 다른 주의할 점이 있다. 바로, 전치 수식 연산자를 매크로 함수에 사용할 경우이다. 다음 예를 보자.

1
2
3
4
#define DOUBLE(x) (x * x)
 
int num = 5
printf("%d\n", DOUBLE(++num));
cs

이때, 값은 6 * 6 = 36이 나오리라 예상하고 위와 같은 수식을 적었을 수 있다.

하지만, 실제 값은 49가 나온다. 이것은, 치환될 때, (++num * ++num)으로 바뀌므로, 5가 2번 ++되어, 7로 바뀐 상태에서 매크로 함수가 진행되는 것이다.


이러한 점을 주의하면서 매크로 상수나 함수를 사용한다면, 근사한 프로그램을 짤 수 있으리라 생각한다.


이상으로 #define 매크로 상수, 함수 정리를 마치겠습니다.


서로 링크 추가는 항상 환영입니다 :)


댓글