본문 바로가기
C

매크로 함수, 인라인 함수(#define, #inline)

by yororing 2024. 6. 25.

00 개요

  • inline 함수가 뭔지 알기 위해 매크로 함수도 알아야 할 것 같아 같이 정리함

 

01 Macro 함수

1. 정의

  • 매크로를 이용하여 함수의 역할을 대신 함 → 치환substitute함
  • 파라미터를 받기 가능, 반환 가능

2. 문법

#define 매크로함수명(인자) 치환내용

 

  • 예시)
#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);
}

3. 장단점

1) 장점

  • 인수 타입 신경 안써도 됨 (이유: 단순히 치환substitute만 해주기 때문)
  • 함수 호출에 의한 성능 저하가 없음

2) 단점

  • 단순 치환 방식이라 복잡한 함수의 기능 구현은 어려움
  • #define은 전처리기 영역에서 단순 치환이기에 결과가 다른 경우가 존재
  • 컴파일에서 발생하는 이터 타입 문제 발견 못함

 

02 Inline 함수

1. 정의

  • 인라인 함수는 정의한 코드들이 인라인 함수 호출 시 그 자리에 인라인 함수 코드 자체가 안으로 들어간다는 뜻
  • 즉, 함수의 내용을 호출을 통해서 실행시키는 것이 아니라, 호출하는 코드 자체가 함수 내용의 코드가 됨

2. 문법

  • 함수 앞에 inline을 붙여주기만 하면 됨
inline 데이터타입 인라인함수명([인자]) {
    함수내용;
}
  • 예시)
#include <stdio.h>

inline int multiple(int a, int b) {
    return a * b;
}

int main(void) {
    int result;
    result = multiple(2, 3);
    printf("%d\n", result);  // 6
    return 0;
}
  • 위와 같이 작성 시 해당 코드는 컴파일을 실행하면 아래와 같이 변경됨
#include <stdio.h>

inline int multiple(int a, int b) {
    return a * b;
}

int main(void) {
    int result;
    result = inline int multiple(2, 3) {    // inline으로 변경된 줄
        return 2 * 3;                       // inline으로 변경된 줄
    }                                      // inline으로 변경된 줄
    printf("%d\n", result);  // 6
    return 0;
}
  • 선언한 함수의 코드를 함수가 실행되는 부분에 복제하여 작동하는 것을 확인

3. 장단점

1) 장점

  • 함수를 따로 실행하지 않고 작동할 수 있기 때문에 실행속도 빨라짐
  • 빠른 속도를 중요시 하는 부분에서 사용하면 적합

2) 단점

  • 코드가 물리적으로 길어지다보니 용량이 커질 수 있음

 

03 Macro 함수와 Inline 함수 비교

Macro 함수 Inline 함수
  • 전처리 단계(Preprocessing)에서 치환이 이루어짐
  • 대치 시 어떠한 타입 검사도 이루어지지 않음
  • 컴파일 단계(Compiling)에서 처리가 이루어짐 (인라인 하느냐 vs 안되느냐)
  • 컴파일러가 처리하기에 타입 검사 이루어짐 (단순 치환이 아닌 함수처럼 작동하기에 디버깅에 더 용이하며 타입 검사 시 안전함)

 

 

참조

  1. () https://velog.io/@wonder_land/C-15.-매크로-함수-인라인-함수
  2. (02 Inline 함수 2. 문법) https://blog.naver.com/makeflood/222603808998
  3. (02 Inline 함수 2. 문법) https://velog.io/@emplam27/C어--인라인-함수
  4. (02 Inline 함수) https://blog.naver.com/makeflood/222603808998
  5. (02 Inline 함수 3. 장단점) https://coding-factory.tistory.com/694
  6. (03 Macro 함수와 Inline 함수 비교) https://indirect91.tistory.com/35
  7.  
  8.  

  

'C' 카테고리의 다른 글

memset (C 메모리 초기화 함수)  (0) 2024.08.28
struct 구조체 (C언어 데이터 타입)  (0) 2024.08.09
Macro (매크로)  (0) 2024.06.25
# 및 ## (C 언어 매크로 연산자)  (0) 2024.06.25
자료형 종류 (C 언어)  (0) 2024.06.24