전처리 연산자 #은 매크로 정의에서 형식 매개변수를 문자열화 한다.
가령 다음과 같이 매개변수를 갖는 매크로를 정의하면,
#define printf(a) printf(#a) // 매개변수로 들어온 녀석을 " 로 감싸버려서 치환해준다.
이제 printf(Hello world!\n); 는 printf("Hello world!\n"); 으로 바뀐 후 컴파일된다.
몇가지 간단한 응용을 생각해 볼 수 있다.
예1.
#define love(a,b) printf(#a " loves " #b)
이렇게 쓰면, love가 받는 두 개의 인자가 각각 " "으로 묶여서 치환되고, printf 내에 " "이 세 개가 나란히 들어가게 되는데, 나열된 문자열 상수는 결합되기 때문에 문자열 a와 b가 포함된 문자열을 인쇄한다.
love(James,Lisa); --> printf("James loves Lisa");
예2.
#define print(a) printf(#a " = %d\n", a)
이렇게 쓰면, 정수형 변수를 받아서, 그것의 이름과 십진 정수값을 포함한 문자열을 출력하는 간단한 매크로가 만들어진다.
int num = 100;
print(num); --> printf("tmp = %d\n", tmp);
-------------------------------------------------------------------------------------------------------
연산자 ## 은 토큰을 결합하는데 사용한다.
가령 x ## i 는 x 와 i 라는 두 개의 토큰을 하나의 토큰 xi 로 만들어 준다. 이것은 각각의 토큰 x 와 i 가 파라미터로 쓰이면서 하나의 토큰 xi 를 만들 수 있게 해준다.
예. #define U(a,i) a##i // 코드에서 U(x,1)라고 썼다면, 그 부분을 x1 으로 대체한다.
#define F(i) f##i
# 과 ## 을 사용하여, 배열과 인덱스를 파라미터로 받아 출력하는 매크로를 다음과 같이 만들 수도 있다.
#define arrprint(arr,index) printf(#arr "[%d] = %d\n", index, arr##[index])
가령 int a[3] = {10,15,22}; 라고 있을 때,
arrprint(a,2); 라는 코드는 다음의 코드로 치환된다.
printf("a" "[%d] = %d\n", 2, a[2]);
그런데, 연속된 문자열이 접합되므로, printf("a[%d] = %d\n", 2, a[2]); 이 된다.
출처: http://sciphy.tistory.com/894
'Computer > C,C++' 카테고리의 다른 글
C언어 - 가변 인자 함수, 동적 인자 함수(Variable Argument Functions) (0) | 2011.06.26 |
---|