아래와 같은 코드가 있습니다.
#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)로 치환이 됩니다.
아래의 소수 계산도 똑같이 진행됩니다.
그래서 결과는
이렇게 나오죠~
어렵지 않죠?
매크로 함수에서
##는 앞 뒤의 토큰을 합친다
#는 문자열로 만든다는것
만 이해하시면 쉽습니다.
만약 코드를 보시다가, 함수 인자로 데이터형을 받는게 보이면 "이건 매크로 함수인가 보구나"라고 생각하셔도 됩니다. 함수 인자로 데이터형을 받는 경우에 매크로 함수일 경우가 많거든요.
'Embedded > Programming language : C' 카테고리의 다른 글
[C] 선언한 배열의 index 이상을 접근하면 어떻게 될까? (0) | 2022.10.27 |
---|---|
[C] Typedef 손쉽게 이해하기. (1) | 2022.10.27 |
[C] 매크로 함수에서 do~while(0)을 쓰는 이유 (0) | 2022.10.26 |
[C] 비트필드 (0) | 2017.04.05 |
[C] for문에서 두개 이상 연산하기. (0) | 2017.04.05 |