8. Macro
매크로의 사전적 의미는 여러 개의 명령을 한 묶음으로 Batch 처리하듯이 만들어 하나의 명령으로 바꾸어 놓은 것을 말합니다.
매크로를 사용함으로써 프로그램 내에서 자주 쓰이는 긴 수식이나 문장을 간략하게 정의하여 편리하게 사용할 수 있습니다.
매크로를 정의하는 문장이 #define 입니다.
매크로의 사용시 주의점
문자 상수나 문자열 상수 내에서는 매크로가 전개 되지 않습니다.
#define문의 치환 리스트가 수식일 때에는 되도록 수식 전체를 괄호로 묶어주는 것이 좋습니다.
1) 상수 매크로
일반 상수 매크로의 사용 형식
#define 매크로이름 치환대상
8-11 실습예제 (일반 매크로 사용 예제)
#include
<stdio.h>
#define PI 3.14
#define MAX 10000
int main()
{
printf("원주율은%5.2f입니다\n",PI);
printf("최대값은%d입니다\n", MAX);
return 0;
}
원주율은 3.14입니다
최대값은 10000입니다
위의 프로그램은 pi 는 3.14로 max는 10000으로 지정된 매크로를 사용한 예제입니다.
매크로이름은 되도록 대문자를 사용하는 것이 좋습니다.
대부분의 예약어나 변수에 소문자 많이 이용하므로 매크로이름과 혼동이 올 수도 있습니다.
2) 함수 매크로
함수를 매크로로 정의하는 형식
#define 매크로이름 (매개변수1, 매개변수2 ….) 치환대상
8-12 실습예제 (매개 변수가 있는 매크로 사용 예제)
#include
<stdio.h>
#define PI 3.14159
#define SQUARE(x) PI * x * x
int main()
{
double radius;
printf("반지름을입력하세요: ");
scanf("%lf", &radius);
printf("원의면적은: %.2lf\n", SQUARE(radius));
return 0;
}
PI를 3.14159로 정의하고 SQUARE 함수는 하나의 숫자를 매개 변수로 받아 PI * 숫자 * 숫자를 계산해주게 됩니다.8-13 실습예제 (두 개의 정수를 받아서 사칙연산을 수행해 주는 매크로)
#include
<stdio.h>
#define ADD(x,y) printf("%d + %d = %d \n",x,y,x+y);
#define SUB(x,y) printf("%d - %d = %d \n",x,y,x-y);
#define MUL(x,y) printf("%d * %d = %d \n",x,y,x*y);
#define DIV(x,y) printf("%d / %d = %d \n",x,y,x/y);
int main()
{
int a,b;
printf("두 개의정수를입력하시오:");
scanf("%d %d",&a,&b);
ADD(a,b); SUB(a,b);
MUL(a,b); DIV(a,b);
Return 0;
}
두 개의 정수를 입력하시오: 3 4
3 + 4 = 7
3 - 4 = -1
3 * 4 = 12
3 / 4 = 0
8-14 실습예제 (매크로에 대한 이해를 도와주는 프로그램)
#include
<stdio.h>
#define ADD(x) x+x
int main()
{
int a, b = 4;
a = ADD(b) / 2;
printf("a = %d\n",a);
return 0;
}
a = 6
위의 프로그램예제에서 a = 6이 출력됩니다.
a는 2가 아니고 ADD매크로에 의해 위의 식은 a = b + b / 2가 되어서 6이 됩니다.
따라서 수식을 매크로로 만들 때에는 연산의 우선순위 문제도 생각해야 합니다.
매크로에서 수식이 치환될 때는 되도록 괄호를 해주는 것이 좋습니다.
3) 매크로와 일반 함수와의 차이
단순하게 보기에는 매크로와 일반 함수는 차이가 없어 보입니다.
하지만 아주 많은 차이를 가지게 됩니다.
매크로를 사용하게 되면 컴파일 할 때 코드는 길어지지만 수행속도는 빨라지게 됩니다.
매크로 코드가 길어지는 이유는 매크로 사용된 부분은 컴파일러가 해당문장을 치환하기 때문에 코드가 길어지게 됩니다.
매크로함수를 사용하는 경우 일반함수를 사용하는 경우보다 실행파일의 코드길이는 길어지게 됩니다.
한편 매크로를 사용하면 매크로를 부르는데(call) 시간이 소요되지 않습니다.
그러나 함수의 경우는 함수에 매개변수로 전달되어야 하고 함수에 해당하는 코드가 있는 부분으로 프로그램 수행을 옮겨야 합니다.
따라서 매크로를 사용하는 것이 실행속도는 빠르게 됩니다.
[프로그래밍] 10. typedef (0) | 2016.10.07 |
---|---|
[프로그래밍] 9. 조건부 컴파일 (0) | 2016.10.07 |
[프로그래밍] 7. #include (0) | 2016.10.06 |
[프로그래밍] 6. 전 처리문의 종류 (0) | 2016.10.06 |
[프로그래밍] 5. 외부 변수(External variable) (0) | 2016.10.05 |