티스토리 뷰



1. # 연산자


  매크로에서 # 연산자는 문자열로 변환(치환) 시켜주는 연산자 입니다.



 아주 단순한 예를 들어보았습니다. 아래의 예제를 한번 살펴보도록 하겠습니다.


#include <stdio.h>
#define PRINT(s)    printf(#s)

int main()
{
    PRINT(THIS IS TEST CODE);
    return 0;
}


만일 PRINT 매크로에서 s앞에 붙은 #이 빠지게 되면 오류가 발생하게 됩니다. 왜냐하면 매크로변수 s는 THIS IS TEST CODE를 받게 되는데, c 문법에 따라 따옴표가 없기 때문에 이것들을 하나의 '변수'로 인식하게 됩니다.


#을 빼주고 "THIS IS TEST CODE" 라고 앞뒤로 따옴표를 붙여주면 잘 실행이 됩니다.


즉, #은 받아온 매크로변수를 문자열로 바꿔주는, 더 쉽게 말해서 앞뒤에 따옴표를 붙이는 것과 같은 의미라고 보시면 됩니다.




2. ## 연산자

 

 그럼 ## 연산자의 역할은 무엇일까요?


##은 두 개의 토큰을 이어준다. 혹은 붙여준다. 의 의미로 생각하시면 됩니다. 


#define INT_i(n)    int i##n;


위와 같은 매크로가 있고, 함수내에서 INT_i(0) 이라는 매크로를 사용했다고 가정합시다.


그렇다면 위의 매크로는 받아온 n이라는 변수를 i##n 와 같이 i하고 붙여준 int형 변수를 선언하게 됩니다. 



즉 위의 매크로와 같은 표현은 


int i0;


입니다. i와 0을 붙여서 하나의 변수로 만들어진것입니다.




그래서 아래의 예제 코드를 만들어 보았습니다.

아래는 잘못된 코드입니다. inurimaster 의 지적으로 수정하였습니다.

위의 내용은 잘못되지 않았으니, 조만간 날림코드가 아닌 좋은 코드로 돌아오겠습니다 :)


#include <stdio.h>

#define INT_i(n)        int i##n = n;
#define SUM(res, n)     ((res) += (i##n))
#define PRINT(n)        printf("i%d = %d\n", n, i##n)

int main()
{
    int res=0;
    int i;

    for(i=0; i<10; i++)
    {
        INT_i(i);
        PRINT(i);
        SUM(res,i);
    }
    
    printf("결과 : %d\n", res);

    return 0;
}


출력결과:


##에서 딱히 떠오르는 예제가 없어서 날림으로 코드를 짰지만, ##연산자에 대해서 충분히 이해하실 수 있을거라고 생각됩니다. ㅎㅎ





댓글
댓글쓰기 폼