C 언어의 특수 전처리기 연산자: #과 ##
C 언어에는 매크로를 더욱 강력하게 만들어 주는 두 가지 특별한 전처리기(preprocessor) 연산자가 있습니다. 바로 문자열화 연산자(Stringize Operator, #)와 토큰 붙여넣기 연산자(Token Pasting Operator, ##)입니다. 이번 글에서는 각 연산자의 개념과 실제 사용 예제를 통해 자세히 살펴보겠습니다.
1. 문자열화 연산자(Stringize Operator, #)
문자열화 연산자(#)는 전처리기 연산자의 일종으로, 컴파일러에게 특정 토큰(token)을 문자열(string)로 변환하도록 지시하는 역할을 합니다. 이 연산자는 매크로 정의 시에만 사용할 수 있습니다.
문자열화 연산자를 활용하면 큰따옴표 없이도 원하는 텍스트를 그대로 문자열로 변환할 수 있다는 점이 가장 큰 장점입니다.
사용 예제
#include<stdio.h>
#define STR_PRINT(x) #x
main() {
printf(STR_PRINT(This is a string without double quotes));
}실행 결과
This is a string without double quotes
위 예제에서 볼 수 있듯이, 매크로 인자로 전달된 문장이 큰따옴표 없이도 그대로 문자열로 변환되어 출력되는 것을 확인할 수 있습니다.
2. 토큰 붙여넣기 연산자(Token Pasting Operator, ##)
토큰 붙여넣기 연산자(##) 역시 전처리기 연산자입니다. 이 연산자는 컴파일러에게 두 개의 토큰을 하나로 합치거나 연결(concatenate)하도록 명령합니다. 마찬가지로 매크로 정의 내부에서만 사용 가능합니다.
사용 예제
#include<stdio.h>
#define STR_CONCAT(x, y) x##y
main() {
printf("%d", STR_CONCAT(20, 50));
}실행 결과
2050
위 예제에서는 숫자 20과 50이라는 두 개의 토큰이 ## 연산자에 의해 하나로 결합되어 2050이라는 단일 값으로 출력됩니다.
정리
# 연산자는 인자를 문자열로 변환하고, ## 연산자는 두 인자를 하나의 토큰으로 결합합니다. 두 연산자 모두 매크로 정의에서만 동작하며, 코드의 유연성과 재사용성을 높이는 데 유용하게 활용됩니다.