Q 11.17 ANSI “stringizing” 전처리기 연산자인 #를 써서 심볼릭 상수의 값을 문자
열에 집어 넣으려고 합니다, 그런데, 그 결과, 상수의 값이 들어가는 대신,
상수의 이름이 들어가는군요.
Answer #의 정의에 따르면, 이 것은 매크로 인자를 (인자가 또 다른 매크로 이름
이더라도 더 이상 확장하지 않고) 바로 문자열로 만듭니다. 매크로가 원래
지닌 뜻으로 확장되길 원한다면 다음과 갈이 두 단계를 거쳐서 쓸 수 있습
니다:
#define Str(x) #x
#define Xstr(x) Str(x)
#define OP plus
char *opname = Xstr(OP);
이 코드는 opname을 “OP”로 설정하지 않고, “plus”로 설정합니다. (즉,
Xstr() 매크로가 인자를 확장하고 Str() 매크로가 문자열로 만듭니다.)
비슷한 상황이 “token-pasting” 연산자인 ##를 쓸 때, 두 매크로의 값을 연
결하려 할 때 발생할 수 있습니다.
#나 ##는 일반 소스 코드에서는 쓰일 수 없으며, 다만 매크로 정의 부분에
서만 쓸 수 있는 연산인 것을 꼭 기억하기 바랍니다.
Q 11.25 memcpy()와 memmove()은 하는 일이 같지 않나요?
Answer memmove()는 원본과 대상이 겹칠 경우에도 안전하게 동작한다는 것을 보
장합니다. memcpy()는 이러한 보증을 하지 않으므로 좀 더 빨리 동작할 수
있습니다.. 의심이 간다면 memmove()를 쓰는 것이 더 안전합니다.