본문 바로가기
C

Macro (매크로)

by yororing 2024. 6. 25.

00 개요

  • 목적: '매크로'란 개념이 뭔지 정리하고자 함 - 컴퓨터 과학 및 C 언어에서의 매크로 개념
  • C 언어에서의 개념에 더 집중

01 Macro란

1. 정의 - in Computer Science

  • 'macro'
  • 컴퓨터 과학에서 매크로는 정해진 순서에 따라 특정한 입력이 특정한 출력으로 매핑되어야 하는지를 정의하는 규칙 또는 패턴을 의미
  • 하나의 매크로를 특정한 출력 시퀀스로 바로 만들어내는 매핑 과정을 "매크로 확장" (macro expansion) 이라고 함
  • 입력과 출력은 may be a sequence of lexical tokens or characters, or a syntax tree
  • Character macros are supported in software applications to make it easy to invoke common command sequences.
  • Token and tree macros are supported in some programming languages to enable code reuse or to extend the language, sometimes for domain-specific languages

2. 정의 - in C 언어

  • 매크로(Macro)는 특정 코드(자주 사용하는)를 하나의 명령어로 묶어 코드를 더 단순하고 간결하게 작성할 수 있도록 하는 문법
  • 매크로 사용 시 코드의 가독성을 높일 수 있을 뿐 아니라 매크로를 수정하면 소스 코드 전체에 수정된 내용이 반영되기 때문에 유지보수 측면에서도 효율적

02 Macro 정의하는 법

1. #define 사용

  • #define 사용하여 정의하며 일반적으로 소스 코드의 제일 상단에 위치함
    • 이유: 이는 C 컴파일러가 소스 파일의 상단에서부터 컴파일하는데, 만일 매크로가 정의되기 이전에 사용될 경우 에러가 발생하기 때문
  • 또한 매크로를 선언할 때는 보통 대문자로 선언하는데 이는 코드의 가독성 때문
  • 매크로는 #define 이후 정의되는 명령어에 따라 매크로 상수매크로 함수로 구분됨
  • NOTE: 매크로는 단순히 '치환'만 함

1) 매크로 상수

#include <stdio.h>

// #define 매크로상수명 값
#define AGE 22
#define NAME "Pearl"

main() {
    printf("My age is %d\n", AGE); // AGE는 전처리 과정에서 22로 치환됨
    printf("My name is %s\n", NAME); // NAME은 전처리 과정에서 Pearl로 치환됨
}

2) 매크로 함수

#include <stdio.h> // printf() 사용

// #define 매크로함수명(인자) 명령어
#define MY_PLUS(A, B) ((A)+(B))
#define MY_MINUS(A, B) ((A)-(B))
#define MY_MULTIPLY(A, B) ((A)*(B))
#define MY_PRINTVALUE(X, Y, Z) printf("PLUS: %d\nMINUS: %d\nMULTIPLY: %d", X, Y, Z);

main() {
    int A = 7;
    int B = 3;

    int _x;
    int _y;
    int _z;

    _x = MY_PLUS(A, B);
    _y = MY_MINUS(A, B);
    _z = MY_MULTIPLY(A, B);

    MY_PRINTVALUE(_x, _y, _z);
}

  • 장점
    • 매크로 함수는 단순 치환만을 해주므로, 인수의 타입을 안 신경씀
    • 매크로 함수를 사용하면 여러 개의 명령문을 동시에 포함 가능
    • 함수 호출에 의한 성능 저하가 일어나지 않으므로, 프로그램의 실행속도가 향상됨 
  • 단점
    • 원하는 결과를 얻는 정확한 매크로 함수의 구현은 어려우며, 따라서 디버깅 또한 매우 어려움
    • 매크로 함수의 크기가 증가하면 사용되는 괄호 또한 매우 많아져서 가독성 떨어짐

03 Macro 정의 해제

1. #undef 사용

#include <stdio.h>

main() {
    #define NUMBER 10
    printf("1st round:\n");
        #ifdef NUMBER
            printf("NUMBER is defined as %d\n", NUMBER);
        #endif
        #ifndef NUMBER
            printf("NUMBER is not defined.\n");
        #endif
    #undef NUMBER
            printf("2nd round:\n");
        #ifdef NUMBER
            printf("NUMBER is defined as %d\n", NUMBER);
        #endif
        #ifndef NUMBER
            printf("NUMBER is not defined.\n");
        #endif 
}

참조

  1. (01 Macro란 1. 정의) https://en.wikipedia.org/wiki/Macro_(computer_science)
  2. (01 Macro란  2. C 언어에서의 Macro란) https://velog.io/@resister_boy/C언어-Macro-대하여
  3. (02 Macro 정의하는 방법 1. #define 사용) https://velog.io/@wonder_land/C-15.-매크로-함수-인라인-함수
  4. (매크로 함수 - 장단점) https://www.tcpschool.com/c/c_prepro_macroFunc#google_vignette
  5.  
  6.