C++ 문자열 리터럴

문자열 리터럴은 함께 사용되어 null로 끝나는 문자열을 형성하는 문자 시퀀스를 나타냅니다. 문자를 큰따옴표로 묶어야 합니다. 다음과 같은 종류의 문자열 리터럴이 있습니다.

  • "xxx"로 표현되는 좁은 문자열 리터럴

  • L"xxx"로 표현되는 와이드 문자열 리터럴

  • R"ddd(xxx) ddd"로 표현되는 원시 문자열 리터럴. 여기서 ddd는 구분 기호입니다. 원시 문자열 리터럴은 좁은 문자열 리터럴(R로 표시) 또는 와이드 문자열 리터럴(LR로 표시)일 수 있습니다.

좁은 문자열 리터럴은 큰따옴표("), 백슬래시(\) 또는 줄 바꿈 문자를 제외한 모든 그래픽 문자를 포함하는 상수 char의 null로 끝나는 배열입니다. 좁은 문자열 리터럴은 C++ 문자 리터럴에 나열된 이스케이프 시퀀스를 포함할 수 있습니다.

const char *narrow = "abcd";

// represents the string: yes\no
const char *escaped = "yes\\no";

와이드 문자열 리터럴은 큰따옴표("), 백슬래시(\) 또는 줄 바꿈 문자를 제외한 모든 그래픽 문자를 포함하는 상수 wchar_t의 null로 끝나는 배열입니다. 와이드 문자열 리터럴은 C++ 문자 리터럴에 나열된 이스케이프 시퀀스를 포함할 수 있습니다.

const wchar_t* wide = L"zyxw";
const wchar_t* newline = L"hello\ngoodbye";

원시 문자열 리터럴은 큰따옴표("), 백슬래시(\) 또는 줄 바꿈 문자를 비롯한 모든 그래픽 문자를 포함하는 상수 char 또는 상수 wchar_t의 null로 끝나는 배열입니다. 원시 문자열 리터럴은 문자 클래스를 사용하는 정규식과 HTML 문자열 및 XML 문자열에 종종 사용됩니다. 자세한 내용은 Bjarne Stroustrup의 C++11에 대한 FAQ 문서를 참조하세요.

// represents the string: An unescaped \ character
const char* raw_narrow = R"(An unescaped \ character)";

// represents the string: An unescaped " character
const wchar_t* raw_wide = LR"(An unescaped " character)";

구분 기호는 원시 문자열 리터럴의 여는 괄호 바로 앞에 오고 닫는 괄호 바로 뒤에 오는 최대 16자의 사용자 정의 시퀀스입니다. 구분 기호를 사용하여 큰따옴표와 괄호를 모두 포함하는 문자열을 구분할 수 있습니다. 이러한 문자열을 사용하면 컴파일러 오류가 발생합니다.

// meant to represent the string: )”
const char* bad_parens = R"()")";

그러나 구분 기호를 사용하면 오류가 해결됩니다.

const char* good_parens = R"xyz()")xyz";

다음과 같이 소스에 줄 바꿈 문자(이스케이프된 문자가 아님)가 있는 원시 문자열 리터럴을 생성할 수 있습니다.

// represents the string: hello
//goodbye
const wchar_t* newline = LR"(hello
goodbye)";

문자열 리터럴의 크기

좁은 문자열 리터럴의 크기(바이트)는 문자 수 + 1(null 종결 문자)이며 와이드 문자열 리터럴의 크기(바이트)는 문자 수 x 2 + 2(null 종결 문자)입니다. 다음은 와이드 문자열 리터럴의 크기를 보여 줍니다.

const wchar_t* str = L"Hello!";
const size_t byteSize = (wcslen(str) + 1) * sizeof(wchar_t);

strlen() 및 wcslen()는 null 종결 문자의 크기를 포함하지 않는 것을 볼 수 있습니다.

문자열 리터럴의 최대 길이는 65535바이트입니다. 이 제한은 좁은 문자열 리터럴과 와이드 문자열 리터럴 모두에 적용됩니다.

문자열 리터럴 수정

문자열 리터럴은 상수이므로 이를 수정하려고 하면(예: str[2] = 'A') 컴파일러 오류가 발생합니다.

Microsoft 전용

Visual C++에서는 문자열 리터럴을 사용하여 포인터를 비상수 char 또는 wchar_t로 초기화할 수 있습니다. 이는 C 코드에서 허용되지만 C++98에서는 더 이상 사용되지 않으며 C++11에서는 제거되었습니다. 문자열을 수정하려고 하면 다음 예제와 같이 액세스 위반이 발생합니다.

wchar_t* str = L"hello";
str[2] = L'a'; // run-time error: access violation

/Zc:strictStrings(문자열 리터럴 형식 변환 사용 안 함) 컴파일러 옵션을 설정할 때 문자열 리터럴이 non_const 문자로 변환되는 경우 컴파일러가 오류를 발생시키게 만들 수 있습니다. auto 키워드는 올바른 (const) 형식으로 확인되기 때문에 이를 사용하여 문자열 리터럴 초기화 포인터를 선언하는 것이 좋습니다. 예를 들어, 다음 예제는 컴파일 타임에 문자열 리터럴에 쓰려는 시도를 catch합니다.

auto str = L"hello";
str[2] = L'a'; // Compiler error: you cannot assign to a variable that is const

경우에 따라 실행 파일의 공간을 절약하기 위해 동일한 문자열 리터럴이 풀링될 수 있습니다. 문자열 리터럴 풀링에서 컴파일러는 각 참조가 문자열 리터럴의 별도 인스턴스를 가리키는 것이 아니라 특정 문자열 리터럴에 대한 모든 참조가 메모리의 같은 위치를 가리키게 합니다. 문자열 풀링을 사용하려면 /GF 컴파일러 옵션을 사용하십시오.

Microsoft 전용 종료

인접 문자열 리터럴 연결

인접 문자열 리터럴은 연결되어 있습니다. 다음 선언은

char str[] = "12" "34";

다음 선언과 동일합니다.

char atr[] = "1234";

또한 다음 선언과 동일합니다.

char atr[] =  "12\
34";

포함된 16진수 이스케이프 코드를 사용하여 문자열 상수를 지정하면 예기치 않은 결과가 발생할 수 있습니다. 다음 예제는 ASCII 5 문자와 f, i, v 및 e 문자가 포함된 문자열 리터럴을 만들려고 합니다.

"\x05five"

실제 결과는 16진수 5F(ASCII 코드의 밑줄)와 i, v 및 e 문자입니다. 올바른 결과를 얻으려면 다음 중 하나를 사용합니다.

"\005five"     // Use octal constant.
"\x05" "five"  // Use string splicing.

유니코드 문자를 포함하는 문자열 리터럴

서로게이트 쌍 및 보조 문자(UTF-16과 같이)는 \U 접두사로 표시됩니다. 이는 단일 문자라기보다 와이드 문자열이며 작은따옴표가 아닌 큰따옴표로 표시됩니다. U, u 및 u8 접두사는 지원되지 않습니다.

const wchar_t* str1 = L"\U0002008A";
const wchar_t* str2 = L"\UD869DED6";
const wchar_t* str3 = L"\Udc00c800";

유니코드에 대한 자세한 내용은 유니코드를 참조하세요. 서로게이트 쌍에 대한 자세한 내용은 서로게이트 쌍 및 보조 문자를 참조하세요.

참고 항목

참조

C++ 리터럴