문자열 내에서는 매크로의 매개변수 치환이 발생하지 않는다.
문자열의 구성을 위한 매크로 함수를 다음의 형태로 정의
#define STRING_JOB(A, B) "A의 직업은 B입니다"
그리고 STRING_JOB(하이, 맨)이라는 매크로 문장이 다으므이 문자열을 만들어낼 것을 기대
"이동춘의 직업은 나무꾼입니다"
그러나 선행처리기는 기대대로 문자열을 만들어내지 못한다.
"문자열 안에서는 매크로의 매개변수 치환이 발생하지 않는다."
따라서 "A의 직업은 B입니다"로 출력이 된다.
이 문제를 어떻게 해결?
# 연산자를 사용하면 됨
문자열 내에서 매크로의 매개변수 치환이 발생하게 만들기: # 연산자
#define STR(ABC) #ABC
"매개변수 ABC에 전달되는 인자를 문자열 "ABC"로 치환해라!"
이렇듯 # 연산자를 치환의 결과를 문자열로 구성하는 연산자이다.
아래 두 코드는
STR(123)
STR(12, 23, 34)
아래와 같이 문자열로 치환이 된다.
"123"
"12, 23, 34"
문자열을 나란히 선언하면 하나의 문자열로 간주.
따라서 아래와 같이 문자열은
char* str = "ABC" "DEF";
아래와 같다
char* str = "ABCDEF";
따라서 다음과 같이 문장 구성도 가능
char* str = STR(12) STR(34);
다음과 같이 치환
char* str = "12" "34";
아래와 동일
char* str = "1234";
예제
#include <stdio.h>
#define STRING_JOB(A, B) #A "의 직업은 " #B "입니다."
int main(void)
{
printf("%s \n", STRING_JOB(하이, 맨));
printf("%s \n", STRING_JOB(하이, 우먼));
return 0;
}
다음과 같이 치환
"하이" "의 직업은 " "맨" "입니다"
"하이의 직업은 맨입니다."
특별한 매크로 연산자 없이 단순히 연결하는 것은 불가능
학번을 조합하는 매크로 함수 예시
20 : 입학년도
10 : 학과코드
444 : 고유 번호
STNUM(20, 10, 444)
이 문장은 선행처리기에 의해서 다음과 같이 치환되길 원함
2010444
매크로 함수를 당장 정의할 수 있음
#define STNUM(Y, S, P) YSP
ㅊ그러나 이를 통해 우리가 우너하는 결과를 얻지 못함.
매개변수 Y, S, P가 붙어있기 때문.
붙여서 표현을 하면, 이는 Y, S, P의 조합이 아닌, 하나의 YSP로 인식이 된다.
결국 Y, S, P에 전달되는 값에 상관 없이 그냥 YSP로 변환이 이뤄짐
한칸씩 띄어보면?
#define STNUM(Y, S, P) Y S P
위와 같이 정의가 되면 변환과정에서 공백도 그대로 반영이 된다.
따라서 2010444라는 하나의 숫자로 구성되는 학번이 아닌 20, 10, 444라는 세 개의 숫자로 구성되는 학번이 만들어진다.
생각해볼 수 있는 방법은 다음 정도
#define STNUM(Y, S, P) ((Y)*100000 + (S)*1000 + (P))
예제
#include <stdio.h>
#define STNUM(Y, S, P) ((Y)*100000 + (S)*1000 + (P))
int main(void)
{
printf("학번 : %d \n", STNUM(20, 10, 444));
return 0;
}
#include <stdio.h>
//#define STNUM(Y, S, P) YSP
//#define STNUM(Y, S, P) Y S P
#define STNUM(Y, S, P) ((Y)*100000 + (S)*1000 + (P))
int main(void)
{
printf("학번 : %d \n", STNUM(20, 10, 444));
return 0;
}
2행의 경우 아래와 같이 치환되어 에러 발생
printf("학번 : %d \n", YSP);
3행의 경우 아래와 같이 치환되어 에러 발생
printf("학번 : %d \n", 20 10 444);
4행의 경우
생각을 잘 해봐야 한다
학생의 고유 번호의 경우 두 자릿수 일 수 있고 세 자릿수 일 수도 있기 때문
만약 044라고 하면 앞에 붙은 0은 8진수를 의미하기 때문
필요한 형태대로 단순하게 결합하기 : 매크로 ## 연산자
"매크로 함수에 10, 65, 075를 전달했으니 1065075가 만들어짐"
이런 것을 충족 시켜줄 수 있는 연산자 => ##
## 연산자는 매크로 함수의 전달인자를 다른 대상(전달인자, 숫자, 문자, 문자열등)과 이어줄 때 사용.
#define CON(UPP, LOW) UPP ## 00 ## LOW
위의 매크로 몸체에는 UPP와 00 그리고 LOW가 순서대로 이어질 수 있도록 ## 연산자가 사용
int num = CON(22, 77);
선행처리기에 의해 컴파일 이전에 다음과 같이 변환
int num = 220077;
매크로를 아래와 같이 바꿔 출력결과 확인 가능
#define STNUM(Y, S, P) Y ## S ## P
#include <stdio.h>
//#define STNUM(Y, S, P) YSP
#define STNUM(Y, S, P) Y ## S ## P
//#define STNUM(Y, S, P) ((Y)*100000 + (S)*1000 + (P))
int main(void)
{
printf("학번 : %d \n", STNUM(20, 10, 44));
return 0;
}
참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C' 카테고리의 다른 글
파일의 분할과 헤더파일의 디자인(27-2) 둘 이상의 파일을 컴파일하는 방법과 static에 대한 고찰 (0) | 2020.12.19 |
---|---|
파일의 분할과 헤더파일의 디자인(27-1) 파일의 분할 (0) | 2020.12.18 |
매크로와 선행처리기(26-3) 조건부 컴파일(Conditional Compilation)을 위한 매크로 (0) | 2020.12.18 |
매크로와 선행처리기(26-2) 대표적인 선행처리 명령문 (0) | 2020.12.17 |
매크로와 선행처리기(26-1) 선행처리기와 매크로 (0) | 2020.12.17 |