티스토리 뷰



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;
}


출력결과:


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




저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글
  • 프로필사진 inurimaster ## 예제가 좀 이상합니다.

    INT_i(i);
    PRINT(i);
    SUM(res,i);

    이렇게 하면 i에 숫자가 들어가지 않습니다.
    컴파일 이전에 치환되기때문에 매크로 함수에 넘겨지는 인자는 그냥 i 그 자체가 되고
    생성되는 변수명은 ii가 됩니다. i1,i2,i3... 이런식으로 되질 않습니다.
    for문 중간에 변수 ii 값을 찍어보면 찍힙니다.
    저도 주인장님처럼 하면 되것 같아서 했다가, 전혀 이상한 결과가 나와서 분석 중에 알게됐습니다.
    2015.07.31 17:54 신고
  • 프로필사진 norux 아 그렇네요
    댓글주신분 말이 100%맞습니다.
    위 코드는 ii로 변수가 만들어지게 되있습니다

    INT_i(0)
    INT_i(1)
    INT_i(2)
    INT_i(3)
    INT_i(4)
    ...
    이런식으로 만들어야합니다..

    혼동을 드려 죄송합니다.
    예제코드는 좋은 예제가 떠오르면 수정하겠습니다
    2015.07.31 18:08 신고
댓글쓰기 폼
1 ... 22 23 24 25 26 27 28 29 30 ... 45