C언어 문법 매크로 연산자 #, ## 정의/예제
아래의 매크로 문장은 어떤 결과를 만들까요?
매크로 함수: #define STRING_NAME(A, B) "A의 이름은 B이다"
매크로 문장: STRING_NAME(하헤호후, 아무개)
예상 결과: 하헤호후의 이름은 아무개이다.
진짜 결과: X (문자열 안에서는 매크로의 매개변수의 치환이 발생하지 않기 때문)
이런 상황에서 매개변수 치환이 이루어지게 하는 연산자, #이 있습니다.
■ # 연산자: 치환
#는 치환의 결과를 문자열로 구성하는 연산자입니다.
#define STRING_NAME(ABC) #ABC
STRING_NAME(랄랄라)라는 문장은 선행처리기에 의해 문자열 "랄랄라"로 치환됩니다. 또한 나란히 선언하면 하나의 문자열로 간주됩니다. 그래서 아래 문장은
char * str = STRING_NAME(랄랄라) STRING_NAME(바다로);
다음의 문자열 선언과 동일해집니다.
char * str = "랄랄라" "바다로";
char * str = "랄랄라바다로";
그럼 이제 STRING_NAME으로 위에서 해결하지 못한 문제를
#define STRING_NAME(A, B) #A " 의 이름은 " #B "이다."
이런 함수로 해결하면 되겠네요.
■ ## 연산자: 결합
##는 매크로 함수의 전달인자를 다른 대상(전달인자, 숫자, 문자, 문자열 등)과 이어줄 때 사용합니다.
#define CON(A, B) A ## 00 ## B
위의 매크로 몸체에서 A와 B가 순서대로 이어질 수 있도록 ## 연산자가 사용되었습니다. 그래서 다음과 같은 문장을 삽입하면
int num = CON(11, 22);
컴파일 전에 선행처리기에 의해 다음과 같이 변환됩니다.
int num = 110022;
-----------------------------------
-----------------------------------
'컴퓨터 공학 > C, C++' 카테고리의 다른 글
[ C ] 전처리기 이해하기4_매크로 함수란? 장단점/활용 (415) | 2020.07.27 |
---|---|
[ C ] 전처리기 이해하기1_전처리기(Preprocessor)란? 정의/용도, 지시문 종류 (395) | 2020.07.27 |
[ C ] 파일 입출력 이해하기5_파일 위치 서식자란? fseek, ftell 함수 (395) | 2020.07.25 |
[ C ] 파일 입출력 이해하기3_파일복사 feof/바이너리 데이터 입출력 fread, fwrite (402) | 2020.07.25 |
[ C ] 파일 입출력 이해하기2_파일의 개방모드(Mode) (398) | 2020.07.25 |
댓글