다음을 통해 공유


인라인 함수와 매크로 비교

컴파일할 때 호출 시점에 함수 코드가 확장된다는 점에서 인라인 함수는 매크로와 비슷하지만 인라인 함수는 컴파일러에 의해 구문이 분석되며 매크로는 전처리기에 의해 확장됩니다. 그 결과 몇 가지 중요한 차이가 생깁니다.

  • 인라인 함수는 일반 함수에 적용되는 모든 형식 안전성 프로토콜을 따릅니다.

  • 인라인 함수는 함수 선언에 inline 키워드를 포함한다는 점을 제외하고 다른 함수와 동일한 구문을 사용하여 지정됩니다.

  • 인라인 함수에 인수로 전달된 식은 한 번 계산됩니다. 매크로에 인수로 전달된 식은 경우에 따라 여러 번 계산할 수 있습니다.

예제

다음 예제에서는 소문자를 대문자로 변환하는 매크로를 보여 줍니다.

// inline_functions_macro.c
#include <stdio.h>
#include <conio.h>

#define toupper(a) ((a) >= 'a' && ((a) <= 'z') ? ((a)-('a'-'A')):(a))

int main() {
   char ch;
   printf_s("Enter a character: ");
   ch = toupper( getc(stdin) );
   printf_s( "%c", ch );
}
  
  

toupper(getc(stdin)) 식의 의도는 콘솔 장치(stdin)에서 문자를 읽고 필요할 경우 대문자로 변환하는 것입니다.

매크로 구현으로 인해 문자가 "a"보다 크거나 같은지 확인하기 위해 한 번, "z"보다 작거나 같은지 확인하기 위해 한 번 getc를 실행합니다. 해당 범위에 속할 경우 문자를 대문자로 변환하기 위해 getc가 다시 실행됩니다. 즉, 문자를 1개만 기다려야 하는데 프로그램이 문자를 2개나 3개 기다립니다.

인라인 함수는 전에 설명한 문제를 해결합니다.

// inline_functions_inline.cpp
#include <stdio.h>
#include <conio.h>

inline char toupper( char a ) {
   return ((a >= 'a' && a <= 'z') ? a-('a'-'A') : a );
}

int main() {
   printf_s("Enter a character: ");
   char ch = toupper( getc(stdin) );
   printf_s( "%c", ch );
}
  
  

참고 항목

참조

inline, __inline, __forceinline