출처: http://www.asmlove.co.kr/zBdC7/viewtopic.php?p=4052

다음의 매크로 치환은 토큰화 되어 my_func 매크로는 적법한 토큰인 my_f 로 치환됨을 보장합니다.

코드:
#define my_func_macro(m_prefix,m_name) m_prefix ## m_name
#define my_func(m_name) my_func_macro(my_,m_name)

void my_f(void)
{
 printf("hello\n");
}

int main(void)
{
 my_func(f)();
 return(0);
}



my_func_macro 를 my_func 로 치환한 것은 ## 구문의 이중확장 방지규칙을 벗어나기 위한것입니다.
예를 들자면 다음과 같은 경우
코드:
#define my_func_macro(m_prefix,m_name) m_prefix ## m_name
#define my_func(m_prefix,m_name) my_func_macro(m_prefix,m_name)

void my_my_f(void)
{
 printf("world\n");
}


다음의 호출은 적법하게 my_my_f로 치환되어 my_my_f 함수를 호출하게 되지만
코드:
my_func(my_,f)();
my_func(my_,my_func(my_,f))();
my_func(my_,my_func_macro(my_,f))();


다음의 호출은 ##의 2중확장 금지조건에 의해서 my_my_f 로 치환되지 못하게 됩니다.
코드:
my_func_macro(my_,my_func_macro(my_,f))();
my_func_macro(my_,my_func(my_,f))();


이때문에 my_func_macro 를 my_func 매크로로 감싸도록 하여 ## 이중확장 금지조건을 회피할수 있게 됩니다.



_________________
도구의 결함은 장인의 손으로 극복한다.

AND