[출처] : 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 |