OneDev
[C] 24. 매크로 함수 & 인라인(inline) 함수 본문
※ 목차
▣ 매크로함수
(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 표준에 포함되었다)
'Language > C' 카테고리의 다른 글
[C] volatile 키워드 (0) | 2023.08.14 |
---|---|
[C] typedef 키워드 (0) | 2023.08.14 |
[C] memcpy (0) | 2023.08.01 |
[C] 23. 메모리 동적 할당(Dynamic Memory Allocation) - malloc, free (0) | 2023.07.31 |
[C] 22. 전처리기 (preprocessor) (#include, #define, #error, #ifdef) (0) | 2023.07.26 |
Comments