인라인 함수와 매크로 비교
컴파일할 때 호출 시점에 함수 코드가 확장된다는 점에서 인라인 함수는 매크로와 비슷하지만 인라인 함수는 컴파일러에 의해 구문이 분석되며 매크로는 전처리기에 의해 확장됩니다. 그 결과 몇 가지 중요한 차이가 생깁니다.
인라인 함수는 일반 함수에 적용되는 모든 형식 안전성 프로토콜을 따릅니다.
인라인 함수는 함수 선언에 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 );
}