Embedded/Programming language : C

[C] 매크로 함수 이해하기

별빛의온기 2022. 10. 26. 15:37
반응형

 

아래와 같은 코드가 있습니다.

 

#include <stdio.h>

int add_int(int x, int y);
float add_float(float x, float y);

#define fun( name0, name1, x, y )		name0##_##name1(x,y)
#define out( name0, name1, data )		out_##name1(name0, name, data)

#define out_int(name0, name1, data)	printf(#name0"_"#name1 ": [ %d ]\n", data)   
#define out_float(name0, name1, data)	printf(#name0"_"#name1 ": [ %f ]\n", data)

void main()
{
	int ia = 200, ib = 30, ic;
	float fa = 15.4, fb = 8.5, fc;

	ic = fun(add, int, ia, ib);		
	out(add, int, ic);

	fc = fun(add, float, fa, fb);	
	out(add, float, fc);
}

int add_int(int x, int y)
{
	return (x + y);
}

float add_float(float x, float y)
{
	return (x + y);
}
 

해석하지 않고 그냥 코드만 보면 add_int 함수와 add_float 함수를 사용하지 않은것처럼 보입니다.

어떻게 해서 진행되고 어떻게 결과가 나올지 한번 눈으로 해석해보세요.

 

 

 

해보셨나요?

이해가 잘되었고 결과 또한 예상이 된다면 이 글을 더 안보셔도 됩니다. ㅎㅎ

 

 

 

그럼 한번 풀어 써볼께요~

 

우선 알아야 할점은 매크로에서

##는 앞 뒤의 토큰을 합친다는것과,

#는 문자열로 만든다는것입니다.

 

이것만 안다면 해석하는데 어렵지 않아요.

 

우선, fun부터 살펴볼까요?

 

ic = fun(add, int, ia, ib); 는 매크로 함수인

#define fun( name0, name1, x, y ) name0##_##name1(x,y) 를 통해서

ic = add_int(ia, ib)로 치환이 됩니다.

안보였던 add_int 함수가 보이네요. 이렇게 해서 ia와 ib를 더한 값을 ic에 대입합니다.

 

자, 이제 out을 살펴봅시다.

out(add, int, ic); 는 매크로 함수인

#define out( name0, name1, data ) out_##name1(name0, name, data) 에 의해서

out_int(add, name, ic)로 치환이 됩니다.

 

그리고 치환된 결과는 다시 매크로 함수인

#define out_int(name0, name1, data) printf(#name0"_"#name1 ": [ %d ]\n", data) 에 의해

printf(add_name : [ %d ]\n", data)로 치환이 됩니다.

 

아래의 소수 계산도 똑같이 진행됩니다.

그래서 결과는

이렇게 나오죠~

어렵지 않죠?

매크로 함수에서

##는 앞 뒤의 토큰을 합친다

#는 문자열로 만든다는것

만 이해하시면 쉽습니다.

 

만약 코드를 보시다가, 함수 인자로 데이터형을 받는게 보이면 "이건 매크로 함수인가 보구나"라고 생각하셔도 됩니다. 함수 인자로 데이터형을 받는 경우에 매크로 함수일 경우가 많거든요.

 

반응형