[C] 매크로

JOOYEUN SEO·2023년 9월 6일

C 언어

목록 보기
12/13
post-thumbnail

매크로(macro)는 프로그램에서 자주 사용되는 명령, 수식, 상숫값에 이름을 붙인 것이다. 선행처리기 #define을 사용하여 정의하며, 컴퓨터는 매크로명을 지정된 자료로 치환한 후 컴파일하는 작업을 수행한다. 매크로 정의는 매크로 상수 정의, 매크로 함수 정의로 나뉜다.

<매크로 사용 주의사항>

  • 매크로명은 일반 변수와 구분이 쉽도록 보통 대문자로 사용
  • 매크로 정의문 끝에는 세미콜론(;) 사용 안 함
  • 문자열이 한 줄을 넘어갈 때는 \를 사용
  • 매크로 정의를 해제할 시 매크로명만 기입
    예) #undef PI

⌨️ 예제 1

// 매크로 상수 정의
#include <stdio.h>

#define ZIP_CODE 24582                  // 정수형 상수
#define TEL "1234-5678"                 // 문자열 상수
#define PRINT_HELLO printf("hello\n");  // printf("hello\n"); 자체가 매크로여서 ; 포함

int main() {
    printf("우편번호 : %d\n", ZIP_CODE);
    printf("전화번호 : %s\n", TEL);
    PRINT_HELLO
}

🖥️ 실행 결과

우편번호 : 24582
전화번호 : 1234-5678
hello

⌨️ 예제 2

// 일반적인 함수 정의
#include <stdio.h>

int square(int a) {
    return a * a;
}

int main() {
    int a;
    scanf("%d", &a);
}

한두 줄의 짧은 코드인 경우 함수로 정의하는 것보다 매크로 함수의 속도가 더 빠르며, 전달 인자의 자료형을 명시할 필요가 없는 장점이 있다.

// 매크로 함수 정의
#include <stdio.h>

#define SQUARE(X) X * X     // 수식 "X * X"를 "SQUARE(X)"로 이름 붙여 정의

int square(int a) {
    return a * a;
}

int main() {
    int a;
    scanf("%d", &a);
    printf("%d\n", SQUARE(a));          // SQUARE(X)의 X 자리에 들어가서 "a * a"가 됨
}

🖥️ 실행 결과

5
25

⌨️ 예제 3

// 매크로 함수 정의 시 안수에 괄호 사용 여부
#include <stdio.h>

#define SQUARE1(X) X * X                // 인수에 괄호 사용 안 함
#define SQUARE2(X) (X * X)              // 인수 전체에 괄호 사용
#define SQUARE3(X) (X * X)              // 인수 전체에만 괄호 사용
#define SQUARE4(X) ((X) * (X))          // 인수 전체와 각 인수에 괄호 사용

int square(int a) {
    return a * a;
}

int main() {
    int a = 5;
    printf("%d\n", 100 / SQUARE1(a));   // "100 / a * a"이 되버림
    printf("%d\n", 100 / SQUARE2(a));   // "100 / (a * a)"가 돼서 정상적으로 계산됨
    printf("%d\n", SQUARE3(a - 1));     // "(a - 1 * a - 1)"이 되버림
    printf("%d\n", SQUARE4(a - 1));     // "((a - 1) * (a - 1))"이 돼서 정상적으로 계산됨
}

🖥️ 실행 결과

100
4
-1
16

매크로는 단순 치환되기 때문에 원하지 않는 계산결과가 나올 수 있다. 따라서 모든 인수에 괄호를 치는 것이 가장 안전하다.


⌨️ 예제 4

// 인수가 2개인 매크로 함수
#include <stdio.h>

#define MAX(A, B) (((A) > (B)) ? (A) : (B))		// 조건 연산자를 매크로 함수로 정의

int main() {
    int a = 5, b = 10;

    printf("%d\n", MAX(a, b));                  // a, b 중에서 최대값이 출력됨
}

🖥️ 실행 결과

10

⌨️ 예제 5

// 인수가 여러 개인 매크로 함수
#include <stdio.h>

#define FOR(I, S, E) for(int I = S; I <= E; I++)	// for문 자체를 매크로 함수로 정의

int main() {
    FOR(i, 1, 10) {         // == for(int i = 1; i <= 10; i++)
        printf("%d ", i);
    }
    printf("\n");
}

🖥️ 실행 결과

1 2 3 4 5 6 7 8 9 10




▷ 김형근·곽덕훈·정재화, 『C프로그래밍』, 한국방송통신대학교출판문화원, 2020
▷ 서현우, 『뇌를 자극하는 C 프로그래밍』, 한빛미디어, 2005
▷ 두들낙서, “두들낙서의 C/C++ 강좌”, https://youtube.com/playlist?list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&si=s8RNpRcpJTi_Lz8M

0개의 댓글