다음을 통해 공유


문자열화 연산자(#)

number-sign 또는 "stringizing" 연산자(#)는 매개 변수 정의를 확장하지 않고 매크로 매개 변수를 문자열 리터럴로 변환합니다. 인수를 사용하는 매크로에서만 사용됩니다. 매크로 호출이 전달하는 실제 인수가 매크로 정의에서 형식 매개 변수 앞에 나오는 경우, 해당 인수는 따옴표로 묶이고 문자열 리터럴로 취급됩니다. 해당 문자열 리터럴은 매크로 정의에서 문자열화된 연산자와 형식적 매개 변수의 조합이 발생할 때마다 이를 대체합니다.

참고 항목

예전에 확장된 매크로 형식 인수가 문자열 리터럴 및 문자 상수 내부에 표시되던 Microsoft C(6.0 및 이전 버전) ANSI C 표준 확장은 더 이상 지원되지 않습니다. 이 확장에 의존한 코드는 문자열화(#) 연산자를 사용하여 다시 작성해야 합니다.

첫 번째 토큰 앞에 실제 인수의 마지막 토큰을 따르는 공백은 무시됩니다. 실제 인수의 토큰 사이의 공백은 결과 문자열 리터럴에서 단일 공백으로 줄어듭니다. 따라서 실제 인수에서 두 토큰 사이에 주석이 발생하면 단일 공백으로 축소됩니다. 결과 문자열 리터럴은 공백으로만 구분되는 인접한 문자열 리터럴과 자동으로 연결됩니다.

또한 인수에 포함된 문자가 일반적으로 문자열 리터럴에서 사용될 때 이스케이프 시퀀스가 필요한 경우(예: 따옴표(") 또는 백슬래시(\) 문자) 문자 앞에 필요한 이스케이프 백슬래시를 자동으로 삽입합니다.

Microsoft C++ 문자열화 연산자는 이스케이프 시퀀스를 포함하는 문자열과 함께 사용될 때 제대로 작동하지 않습니다. 이 경우 컴파일러는 컴파일러 오류 C2017을 생성합니다.

예제

다음 예제에서는 문자열화 연산자를 포함하는 매크로 정의와 매크로를 호출하는 main 함수를 보여줍니다.

// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf_s( #x "\n" )
int main() {
   stringer( In quotes in the printf function call );
   stringer( "In quotes when printed to the screen" );
   stringer( "This: \"  prints an escaped double quote" );
}

매크로는 stringer 전처리 중에 확장되어 다음 코드를 생성합니다.

int main() {
   printf_s( "In quotes in the printf function call" "\n" );
   printf_s( "\"In quotes when printed to the screen\"" "\n" );
   printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
In quotes in the printf function call
"In quotes when printed to the screen"
"This: \"  prints an escaped double quote"

다음 예제에서는 매크로 매개 변수를 확장하는 방법을 보여 줍니다.

// stringizer_2.cpp
// compile with: /E
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
FB(F B)
FB1(F B)

참고 항목

전처리기 연산자