'전처리기'에 해당되는 글 1건

  1. 2011.11.09 전처리기 (1)
프로그래밍/C2011. 11. 9. 10:26

출처: 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)

Posted by code cat