Literały ciągu języka C++
Literał ciągu reprezentuje sekwencję znaków, które tworzą ciąg zerem.Znaki muszą być ujęte w podwójnym cudzysłowie.Dostępne są następujące rodzaje literały:
Wąskie literały reprezentowane jako "xxx".
Szeroki string literały reprezentowane jako L"xxx".
Literały nieprzetworzony ciąg reprezentowane jako R"ddd(xxx) ddd", gdzie ddd jest ogranicznik.Nieprzetworzony ciąg literały może albo Sprecyzuj (reprezentowane z R) lub całego (reprezentowane z LR).
Literałem ciągu wąskie jest tablicą zerem stałej char zawierający dowolnego znaku graficznego, z wyjątkiem znaku cudzysłowu ("), ukośnika odwrotnego (\\) lub znaku nowego wiersza.Wąskie literałem ciągu może zawierać sekwencji ucieczki na liście Literały znaków C++.
const char *narrow = "abcd";
// represents the string: yes\no
const char *escaped = "yes\\no";
Literałem ciągu międzynarodowe jest tablicą zerem stałej wchar_t zawierający dowolnego znaku graficznego, z wyjątkiem znaku cudzysłowu ("), ukośnika odwrotnego (\\) lub znaku nowego wiersza.Międzynarodowe literałem ciągu może zawierać sekwencji ucieczki na liście Literały znaków C++.
const wchar_t* wide = L"zyxw";
const wchar_t* newline = L"hello\ngoodbye";
Nieprzetworzona literałem ciągu jest tablicą zerem — albo stałej char lub stałej wchar_t— zawiera dowolnego znaku graficznego, włącznie z podwójnym cudzysłowie ("), ukośnika odwrotnego (\\) lub znaku nowego wiersza.Nieprzetworzony ciąg literały są zwykle używane w wyrażeń regularnych klasy znaku, a w ciągów HTML i XML ciągi.Przykłady, zobacz artykuł: Bjarne Stroustrup często zadawane pytania w C ++ 11.
// 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)";
Ogranicznik jest zdefiniowana przez użytkownika sekwencję do 16 znaków bezpośrednio przed nawiasu otwierającego literału ciągu pierwotne i natychmiast jest zgodna z jego nawias zamykający.Ogranicznik służy do odróżniania ciągi, które zawierają znaki cudzysłowu podwójnego i nawiasy.Powoduje to, że błąd kompilatora:
// meant to represent the string: )”
const char* bad_parens = R"()")";
Jednak ogranicznik rozpoznaje go:
const char* good_parens = R"xyz()")xyz";
Można utworzyć literału nieprzetworzony ciąg, w którym w źródle jest nowym wierszem (nie zmienionym znaczeniu znaków):
// represents the string: hello
//goodbye
const wchar_t* newline = LR"(hello
goodbye)";
Rozmiar literały
Rozmiar (w bajtach) wąskie literałem ciągu to liczba znaków plus 1 (dla kończącego znaku null); rozmiar (w bajtach) międzynarodowe literałem ciągu jest liczba znaków godziny 2 oraz 2 (dla kończącego znaku null).Pokazuje rozmiar całego ciągu literału:
const wchar_t* str = L"Hello!";
const size_t byteSize = (wcslen(str) + 1) * sizeof(wchar_t);
Należy zauważyć, że strlen() i wcslen() nie uwzględniają wielkość kończącego znaku null.
Maksymalna długość ciągu literału to 65535 bajtów.Ten limit dotyczy zarówno wąskie literały i szerokości literały.
Modyfikowanie literały
Ponieważ literały są stałe, próby zmieniać je — na przykład str [2] = "A" – powoduje wystąpienie błędu kompilatora.
Specyficzne dla firmy Microsoft
W programie Visual C++ literałem ciągu można użyć do zainicjowania wskaźnik do innych niż stała char lub wchar_t.To jest dozwolone w kodzie C, ale jest przestarzały w C ++ 98 i usunięte w C ++ 11.Próba zmodyfikowania ciągu powoduje naruszenia zasad dostępu, jak w poniższym przykładzie:
wchar_t* str = L"hello";
str[2] = L'a'; // run-time error: access violation
Może powodować kompilatora emitować wystąpił błąd podczas konwersji literałem ciągu znak non_const po ustawieniu /Zc:strictStrings (Wyłączanie konwersji typów literału ciągu) opcję kompilatora.Najlepiej używać auto słowo kluczowe do deklarowania ciąg zainicjowana literał wskaźniki, ponieważ jej jest rozpoznawana jako prawidłowego typu (stała).Na przykład w tym przykładzie wyłapuje próba zapisu na ciąg literału w czasie kompilacji:
auto str = L"hello";
str[2] = L'a'; // Compiler error: you cannot assign to a variable that is const
W niektórych przypadkach mogą być połączone identyczne literały, można zapisać miejsca w pliku wykonywalnego.W puli literał ciągu przyczyny kompilatora usunięcia wszystkich odwołań do literału do tej samej lokalizacji w pamięci, zamiast każdego odwołania pkt ciągu określonego punktu do innego wystąpienia literałem ciągu.Aby włączyć buforowanie ciągu, należy użyć /GF opcję kompilatora.
Specyficzne dla zakończenia firmy Microsoft
Łączenia sąsiadujących literały
Sąsiadujące literały są połączone.Deklaracja:
char str[] = "12" "34";
jest taka sama, jak ta deklaracji:
char atr[] = "1234";
i oświadczenie to:
char atr[] = "12\
34";
Za pomocą kodów osadzonych ucieczki szesnastkowych do określenia stałych ciąg może spowodować uzyskanie nieoczekiwanych wyników.Poniższy przykład zamierza utworzyć literałem ciągu zawierającego znak ASCII 5, po którym następuje f znaków, i, v i e:
"\x05five"
Rzeczywisty wynik jest 5F szesnastkowych, który jest kod znaku podkreślenia, po którym następuje znaków ASCII i, v i e.Aby uzyskać prawidłowego wyniku, można użyć jednej z tych:
"\005five" // Use octal constant.
"\x05" "five" // Use string splicing.
Literały ze znaków Unicode
Pary znaków i dodatkowych znaków (tak jak UTF-16) są reprezentowane z \U prefiksu.Te są zamiast pojedyncze znaki międzynarodowe ciągi i są reprezentowane podwójne znaki cudzysłowu, a nie znaki apostrofu.U, u i prefiksy u8 nie są obsługiwane.
const wchar_t* str1 = L"\U0002008A";
const wchar_t* str2 = L"\UD869DED6";
const wchar_t* str3 = L"\Udc00c800";
Aby uzyskać więcej informacji na temat Unicode, zobacz Unicode).Aby uzyskać więcej informacji na temat pary znaków, zobacz par znaków i dodatkowych znaków.