출처: C 언어 펀더멘탈, 전웅 저, 한빛미디어
#define int2hex(n) ((int)"0123456789ABCDEF"[(int)(n)])
int (int2hex)(int n)
{
return "012345678ABCDEF"[n];
}
(int2hex)를 괄호로 둘러쌓아, 만일
int int2hex(int n)
으로 함수를 정의했을 때 매크로로 확장되는 걸 방지 할 수 있다. 함수의 주소를 취할 때도 함수명만 사용하거나 함수명에 번지 연산자를 붙인 형태를 사용하기 때문에 전처리 과정에서 매크로로 확장되지 않는다.
만약 필요에 따라 매크로가 아닌 실제 함수를 호출하고 싶다면, #undef 지시자를 사용하거나 다음과 같은 형태의 함수 호출 수식을 사용할 수 있다.
(int2hex)(12);
한편 매크로 함수를 사용하는 또 다른 경우는, 이미 구현되어 있는 함수에서 일정 개수의 인자를 특정 값으로 고정해 사용하는 경우이다. 특히 이는 라이브러리를 구현할 때 많이 사용하는 방법이다. 예를 들어 line()이라는 함수가 구현되어 있다고 하자.
#define line_h(x, y, len, c, s) (line((x),(y),(x)+(len)-1, (y),(c),(s)))
#define line_v(x, y, len, c, s) (line((x),(y),(x),(y)+(len)-1,(c),(s)))
등으로 간단히 매크로로 대체할 수 있다.
여러 수식을 하나의 수식으로 만들어 매크로 함수에 담는 것은 쉼표 연산자를 사용하면 간단하다. 특히 쉼표 연산자는 피연산자로 주어진 수식 사이에서 평가순서와 시퀀스 포인트를 보장해 주기 때문에 연속적인 수식문과 동일하게 사용된다.
#define func_seq() (func1(a,b,c,d),\
func2(a,b,c,d),\
func3(a,b,c,d))
매크로 함수 사용시에 세미콜론의 사용여부를 다음과 같이 간단히 처리 할 수 있다.
#define SMT(test, ret) \
do{ \
if(!(test)){ \
set_error(SMT_ERROR); \
return ret;
}
}while(0)
'프로그래밍 > C' 카테고리의 다른 글
process & signal (0) | 2012.01.25 |
---|---|
error: invalide storage class for function 'xxxx' (0) | 2011.11.29 |
대상체의 기억수명 (0) | 2011.11.29 |
열거, enum, 이놈 (0) | 2011.11.28 |
구조체 멤버로 주소 저장, 구조체 멤버로 연속적인 메모리 구성하기 (0) | 2011.10.23 |