C언어, 전처리기 연산자 # ##

gurumong의 이미지

전처리기 연산자에 대해서 공부하고 있습니다

#include stdio.h
 
#define HASH # ## #
#define XSTRING(x) STRING(x)
#define STRING(x) # x
 
int main(void)
{
    printf("%s\n", XSTRING(aaa HASH bbb));
    // 출력 : aaa ## bbb
 
    return 0;
}

출력이 aaa # ## # bbb 출력되어야하는것이 아닌가요?
왜 이렇게 나오는지 도무지 모르겠어요

HASH에 의해서 치환되는 ##는 전처리기 연산자의 기능을 할수없는걸로 알고있는데
#연산자도 마찬가지가 아닌가요?
그래서 출력때 이 모두가 그대로 출력되어야하는것 같은데요
aaa # ## # bbb
볼드체 부분은 어디가고 ##만 출력되는지 모르겠네요

JuEUS-U의 이미지

"##"을 표현해야겠는데,
##은 token concatenation이라고 연산자입니다.
따라서 그냥 ##이라고 define하면 에러가 뜹니다.

이 연산자의 기능은 앞 뒤의 토큰을 하나의 토큰으로 이어주는 것으로
# ## #이라고 define하면, ##이 만들어지는 것입죠우 = ω=)r

gurumong의 이미지

이제 보니까 ## 연산자로 양쪽에 있는 #를 합쳐주는것이네요;;
##연산자의 기능을 이미 알고있었는데
왜 그걸 생각못했는지 T.T

뭔가 제가 좀 생각하는 깊이가 좀 부족한거 같네요 T.T