티스토리 뷰
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;
}
출력결과:
##에서 딱히 떠오르는 예제가 없어서 날림으로 코드를 짰지만, ##연산자에 대해서 충분히 이해하실 수 있을거라고 생각됩니다. ㅎㅎ
'C, C++ > C, C++' 카테고리의 다른 글
atoi(), itoa() 함수에 대하여.. (12) | 2014.03.03 |
---|---|
c언어 매크로 사용법 - 2. 가변인자 매크로 (0) | 2014.03.02 |
C언어 bsearch() - 이진탐색 함수 (0) | 2014.02.16 |
C언어 가변인자(가변파라미터)를 사용해보자 (7) | 2014.01.25 |
c/c++ sprintf, snprintf 함수 (13) | 2014.01.21 |
- Total
- Today
- Yesterday
- 우분투 16.04
- JavaScript
- 폰트 조정
- typeScript
- zone
- qemu linux arm
- NgZone
- Zone.js
- Swift
- angular2
- itoa
- 스위프트
- ansi color
- git 설정
- 안시 컬러
- Rx.js
- 안시 색상
- terminal 색
- vim
- 리눅스 터미널 색상
- C언어
- lua table
- QT
- 타입스크립트
- git proxy
- Angular
- ECMA2015
- observable
- ZONES
- 챗봇
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |