OneDev

[C] 24. 매크로 함수 & 인라인(inline) 함수 본문

Language/C

[C] 24. 매크로 함수 & 인라인(inline) 함수

one_dev 2023. 8. 10. 15:48

※ 목차

▣ 매크로함수

 (0) 매크로 함수란?

 (1) 매크로 함수 정의 방법

 (2) 매크로 함수와 실제 함수와의 차이점

 (3) # 과 ##

▣ 인라인 함수

 (1) 인라인 함수 정의 방법

 (2) 인라인함수 vs 매크로함수


▣ 매크로함수

0. 매크로 함수란?

→ C 에서 매크로 함수란 #define 전처리 지시자를 이용해 함수처럼 동작하는 매크로를 말한다

→ 이러한 매크로를 "함수 같은 매크로(function-like-macro)" 또는 "매크로 함수" 라 한다

 

1. 매크로 함수 정의 방법

매크로 함수 정의 방법

(예시) 

#define square(x) x*x

 

2. 매크로 함수와 진짜 함수의 차이점

매크로 함수의 동작 방식#define  문을 통한 치환과 동일하다

→ 즉 매크로 함수는 컴파일 되기 전에  치환을 수행한다

#define square(x) x * x

/* 아래 두 줄은 같은 문장이다 */
printf(square(3));
printf(3 * 3);

/* 아래 두 줄은 같지 않다*/
printf(squer(4));
printf(squre(3+1)); // x 를 3 + 1 로 치환해 3 + 1 * 3 + 1 이 되기 때문

#define 전처리 지시자를 이용해 정의한 매크로 함수는 변수에 대입하는 것이 아닌 변수를 치환하는 것으로, 괄호를 사용할 때 세심한 주의가 필요하다

// 인자의 제곱으로 치환해주는 매크로 함수
#define square(x) x * x 

// square(4) 와 square(3+1) 은 같지 않다
square(4) // --> 4 * 4 로 치환
square(3+1) // --> 3+1 * 3+1 로 치환

/* ================================= */

#define square(x) (x) * (x)
// 위와 같이 정의한 경우에는 square(4) 와 square(3+1)이 같다
square(3+1) // --> (3+1) * (3+1) 로 치환되기 때문

 

 

 

3. # 과 ##

 # 과  ## 은 모두 전처리기문 에서만 사용할 수 있다

  •  # : #을 붙인 인자를 문자열로 바꿔준다
  •  ##  : 입력된 인자들을 하나로 합쳐준다

<예시>

#include<stdio.h>
#define PRINT_NAME(var) printf(#var "\n");
#define ADD_NAME(x, y) x##y
int main(){
    int a, b;
    
    PRINT_NAME(a); // --> 전처리기에 의해 printf("a" "\n"); 로 치환
    
    int ADD_NAME(a,b);  // --> 전처리기에 의해 int ab; 로 치환
    ab = 3;
    printf("%d \n", ab); 
    
    return 0;
}

 

▣ 인라인(inline) 함수

매크로함수가 여러 편리한 점들을 가지고 있는 것은 사실이나, 문제점들도 있다. 괄호를 제대로 쓰지않아 오류가 나는 경우도 많고, 이 경우 디버깅하기도 매우 까다롭다. 이러한 문제를 해결하기위해 C 에서 제시한 해결책이 인라인 함수이다

 

1. 인라인 함수 정의 방법

함수 앞에   inline  키워드를 붙여주면 된다

 

<예시>

#include<stdio.h>
inline int square(int a) {return a * a ; }
inline int cubic(int a) {return a * a * a ; }

int main(){
    printf("%d \n", square(4));
    printf("%d \n", cubic(5));
    return 0;
}

 

2. 인라인 함수 vs 매크로 함수

인라인 함수와 매크로 함수 모두 "함수 처럼 동작" 한다는 공통점이 있지만, 차이점도 있다.

  • 매크로 함수가 무식하게 치환만 수행하고 이에 따라 연산자 우선 순위를 정확히 고려해야 하는 것과 달리, 인라인 함수의 경우 컴파일러에서 적절히 "보통 함수를 사용하는 것처럼" 바꿔준다(컴파일러에서 처리)
  • 또한 인라인 함수는 매크로 함수와 달리 인자들의 타입을 확인한다.
  • 인라인 함수는 단순 치환을 하는 것이 아닌 실제 함수 처럼 동작하기 때문에 매크로 함수보다 구현이 쉽고 편리하다
  • 디버깅 역시 인라인 함수가 더 편리하다

→ 이러한 점들로 인해 매크로 함수보다는 인라인 함수가 권장된다

(이전 C 표준에 없던 인라인 함수는 C99 라는 새로운 C 표준에 포함되었다)

Comments