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
댓글 없음:
댓글 쓰기