Post List

2015년 1월 4일 일요일

C++ #define 함수매크로의 #, ## operator

C++의 경우 작업의 편의성과 Readability 를 높이기 위해서 매크로 변수를 종종 사용한다.

매크로 변수의 경우 #, ## operator 를 사용하면 편리하게 사용 할 수 있다.

1. # operator : Stringizing Operator

 Parameter를 문자열로 인식한다.

int main() {
   printf_s( "In quotes in the printf function call\n" "\n" );
   printf_s( "\"In quotes when printed to the screen\"\n" "\n" );
   printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
위의 예제를 # operator를 이용한 함수매크로로 정의를 해보면

#define stringer( x ) printf_s( #x "\n" )
int main() {
   stringer( In quotes in the printf function call );
   stringer( "In quotes when printed to the screen" );  
   stringer( "This: \"  prints an escaped double quote" );
}
이와 같이 표현이 가능하다.

2. ## operator : Token-Pasting Operator

## 앞과 뒤의 문자열을 붙여준다.

#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;

int main()
{
   paster(9);
}
위 예제의 실행 결과는

token9 = 9

이다.

-----------------

함수매크로의 경우 1개의 개체를 생성하기 위한 Code 의 길이가 긴 경우 사용하면 편리하다.

ex)
CObjManager * pManager = new CObjManager(initValue);
CCallback * pCallback = new CCallback();
pManager->Regist(pCallback);
ctrlObj = new CController(pManager, INT, INT_MIN, INT_MAX);

CController 하나를 생성할때마다 위의 Code를 계속 반복해야 한다면,
(CCallback 의 경우 CController 마다 Class를 각각 다르게 설정해야 한다면)

#define SET_CONTROLLER( ctrl, initValue, CallbackName, TypeName) \
{ \
    CObjManager *pManager = new CObjManager(initValue); \
    CallbackName *pCallback = new CallbackName(); \
    pManager->Regist(pCallback); \
    ctrl = new CController(pManager, TypeName, TypeName##_MIN, TypeName##_MAX); \
}

위와 같이 함수매크로를 만들어 놓고

SET_CONTROLLER ( ctrlObj, initValue, CCallback, INT );

로 호출을 하면 같은 작업이 가능하다.

참조 : MSDN http://msdn.microsoft.com/en-us/library/7e3a913x.aspx
                  http://msdn.microsoft.com/en-us/library/09dwwt6y.aspx

댓글 없음:

댓글 쓰기