Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C 언어의 문자열화(#)와 토큰 붙여넣기(##) 연산자 완벽 정리

개요

C 언어의 전처리기(preprocessor)는 본격적인 컴파일에 앞서 소스 코드를 먼저 처리하는 단계입니다. 이 전처리기에서 사용할 수 있는 특수 연산자 두 가지가 바로 문자열화 연산자(Stringize Operator)토큰 붙여넣기 연산자(Token Pasting Operator)입니다. 두 연산자 모두 매크로 정의 내부에서만 사용할 수 있으며, 매크로의 활용 범위를 크게 넓혀 주는 강력한 도구입니다.

문자열화 연산자(#)

문자열화 연산자는 전처리기에게 "이 토큰을 문자열로 변환하라"고 지시하는 연산자입니다. 매크로 정의에서 매개변수 앞에 #를 붙이면, 매크로 호출 시 전달된 인자가 큰따옴표 없이도 그대로 문자열 리터럴로 변환됩니다.

일반적으로 문자열을 만들려면 큰따옴표(" ")로 감싸야 하지만, 문자열화 연산자를 사용하면 어떤 텍스트든 따옴표 없이 간편하게 문자열로 만들 수 있다는 점이 핵심입니다.

예제 코드

#include <stdio.h>
#define STR_PRINT(x) #x

int main() {
    printf(STR_PRINT(This is a string without double quotes));
    return 0;
}

실행 결과

This is a string without double quotes

위 예제에서 STR_PRINT 매크로에 전달된 인자는 전처리 단계에서 자동으로 "This is a string without double quotes"라는 문자열로 변환되어 printf 함수에 전달됩니다.

토큰 붙여넣기 연산자(##)

토큰 붙여넣기 연산자는 전처리기에게 "두 개의 토큰을 하나로 합쳐라(연결하라)"고 지시하는 연산자입니다. 매크로 정의에서 두 토큰 사이에 ##를 넣으면, 전처리 과정에서 공백이 제거되고 두 토큰이 하나의 새로운 토큰으로 결합됩니다.

예제 코드

#include <stdio.h>
#define STR_CONCAT(x, y) x##y

int main() {
    printf("%d", STR_CONCAT(20, 50));
    return 0;
}

실행 결과

2050

위 예제에서 STR_CONCAT(20, 50)은 전처리기에 의해 2050이 연결된 2050이라는 하나의 정수 리터럴로 확장됩니다. 이처럼 토큰 붙여넣기 연산자는 숫자나 식별자를 동적으로 조합해야 할 때 매우 유용하게 사용됩니다.

정리

  • # (문자열화 연산자): 매크로 인자를 큰따옴표 없이 문자열로 변환합니다.
  • ## (토큰 붙여넣기 연산자): 두 개의 토큰을 하나로 연결하여 새로운 토큰을 생성합니다.
  • 두 연산자 모두 #define으로 정의한 매크로 내부에서만 사용할 수 있는 전처리기 연산자입니다.