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";
유니코드에 대한 자세한 내용은 유니코드를 참조하세요. 서로게이트 쌍에 대한 자세한 내용은 서로게이트 쌍 및 보조 문자를 참조하세요.