C - 매크로 함수

원종서·2023년 2월 16일
0

C

목록 보기
3/3

매크로 함수


#include <stdio.h>
#define square(x) x * x

int main(){
	printf('square(3) : %d", square(3)); //-> square(3) : 9
    
}

#define 함수 이름(인자) 치환 할 것

함수와 매크로 함수의 차이

매크로 함수는 컴파일이 진행되는 순간

printf('square(3) : %d", square(3)); 를
printf('square(3) : %d", 3 * 3); 으로 바꿔버림

문제점.

printf('square(3+1) : %d", square(3+1)); -> 7로 출력됨.

// 이유는 치환 과정에서  printf('square(3+1) : %d", square(3+1));  -> printf('square(3+1) : %d", 3+1  * 3+1);  

// 가 되어 버리기 때문 3+3+1 -> 7

//  해결 방안은 사친연산법칙에 따라 적절히 괄호를 붙여주는 것.
// #define square(x) (x) * (x)
#define printVarName(var) printf(#var "¥n")
#define addName(x,y) x##b

int main(){
	int a;
    
    // 매크로에 #가 붙으면 문자열로 바꿈.
	printVarName(a); -> a¥n
    
    
    // 매크로에 ## 가 붙이면 ##의 앞뒤문자를 합친다.
    int addName(x,y); -> int xy;
    
    xy = 3
    
    printf("%d",xy); - 3
    
}

인라인 함수

매크로 함수의 단점을 보안해서 나온 인라인 함수.

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

int main(){
	printf("%d", square(3)); -> 9
}

인라인 함수와 일반 함수의 차이

로직에서 일반 함수를 호출하면 코드의 흐름이 호출되는 함수쪽으로 완전히 넘어가게 된다.
그후 호출한 함수가 반환을 하면 다시 원래 자리로 돌아오게 되는 형식이다.

인라인 함수는 매크로 함수처럼 컴파일 단계에서 치환 작업을 하지만,
매크로 함수와는 다르게 일반 함수처럼 적절히 바꿔준다. (타입 체크도 함)

컴파일러 관점에서 인라인 함수가 일반함수처럼 적절히 바꿔서 사용되는 것보다
매크로 처럼 단순한 치환으로 처리하는 좋다면 컴파일러는 매크로 함수처럼 인라인 함수를 치환시켜버린다.

결론

매크로 함수보다 인라인 함수를 쓰는 것을 권장한다.

0개의 댓글