본문 바로가기

Programming/C/C++

c언어 매크로 사용법 - 1. #, ## 연산자

[출처] : http://norus.tistory.com/22


1. # 연산자


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



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


1
2
3
4
5
6
7
8
#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을 붙여서 하나의 변수로 만들어진것입니다.




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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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;
}


출력결과:




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

'Programming > C/C++' 카테고리의 다른 글

gettimeofday를 대체하는 clock_gettime 함수  (0) 2014.12.22
std::find 클래스 멤버로 찾기  (0) 2014.12.11
HEX dump  (0) 2014.12.01
C Timer 만들어 사용하기.  (0) 2014.11.08
C++ 마스터로 가는길..  (0) 2014.10.07