Textové literály jazyka C++
Řetězcový literál představuje posloupnost znaků, které společně tvoří řetězec ukončený hodnotou null.Znaky musí být uzavřen mezi dvojité uvozovky.Existují následující typy řetězcové literály:
Zúžit řetězcových vyjádřena jako "xxx".
Široký řetězce literály, vyjádřena jako L"xxx".
Nezpracovaný řetězec literály vyjádřena jako R"ddd(xxx) ddd", kde ddd je oddělovač.Nezpracovaný řetězec literály může být buď zúžit (vyjádřena s R) nebo WAN (vyjádřena s LR).
Úzký řetězcový literál je pole ukončený hodnotou null konstanty char libovolný grafický znak s výjimkou dvojité uvozovky ("), lomítkem (\\) nebo znaku, který obsahuje.Úzký řetězcový literál mohou obsahovat řídicí sekvence, uvedené v Znakové literály jazyka C++.
const char *narrow = "abcd";
// represents the string: yes\no
const char *escaped = "yes\\no";
Široký řetězcový literál je pole ukončený hodnotou null konstanty wchar_t libovolný grafický znak s výjimkou dvojité uvozovky ("), lomítkem (\\) nebo znaku, který obsahuje.Široký řetězcový literál mohou obsahovat řídicí sekvence, uvedené v Znakové literály jazyka C++.
const wchar_t* wide = L"zyxw";
const wchar_t* newline = L"hello\ngoodbye";
Nezpracovaná řetězcový literál je pole ukončený hodnotou null – buď konstanty char nebo konstantní wchar_t– všechny grafické znak, včetně dvojité uvozovky ("), lomítkem (\\) nebo znaku, který obsahuje.Nezpracovaný řetězec literály se často používají regulární výrazy, které používají třídy znaků a řetězce ve formátu HTML a XML řetězce.Příklady naleznete v následujícím článku: Bjarnem Stroustrupem nejčastější dotazy týkající se v 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)";
Oddělovač je uživatelem definovaný posloupnost až 16 znaků, která bezprostředně předchází otevírací závorka nezpracovanou řetězce literálu a následuje jeho uzavírací závorka.Oddělovač slouží k rozlišení řetězce, které obsahují dvojité uvozovky a zároveň závorky.To způsobí, že chyba kompilátoru:
// meant to represent the string: )”
const char* bad_parens = R"()")";
Ale oddělovač je vyřeší:
const char* good_parens = R"xyz()")xyz";
Můžete vytvořit nezpracovanou řetězcový literál ve kterém je nový řádek (není řídící znak) ve zdroji:
// represents the string: hello
//goodbye
const wchar_t* newline = LR"(hello
goodbye)";
Velikost řetězcové literály
Velikost (v bajtech) úzký řetězcový literál je počet znaků plus 1 (pro ukončující znak null); velikost (v bajtech) wide řetězcový literál je počet znaků časy 2 plus 2 (pro ukončující znak null).To uvádí velikost široký řetězec literálu:
const wchar_t* str = L"Hello!";
const size_t byteSize = (wcslen(str) + 1) * sizeof(wchar_t);
Všimněte si, že strlen() a wcslen() nezahrnují velikost ukončující znak null.
Maximální délka řetězcový literál je 65535 bajtů.Toto omezení se vztahuje na úzký řetězcové literály a široké řetězcové literály.
Úprava řetězcové literály
Protože řetězcových konstant, pokusu o změnu jejich – například str [2] = "A" – způsobí chybu kompilátoru.
Specifické pro Microsoft
V aplikaci Visual C++ vám pomohou řetězcový literál inicializovat ukazatel na jiné b char nebo wchar_t.Toto je povolen v kódu jazyka C, ale je zastaralý v C ++ 98 a v C ++ 11 odebrána.Pokus o změnu řetězec způsobuje chybu narušení přístupu, jako v následujícím příkladu:
wchar_t* str = L"hello";
str[2] = L'a'; // run-time error: access violation
Může způsobit kompilátoru pro generování chybu při převodu řetězcový literál non_const znak, když je nastaven /Zc:strictStrings (Zakázání převodů typů řetězcových literálů) možnosti kompilátoru.Je vhodné používat auto klíčové slovo deklarovat řetězec inicializována literál ukazatele vzhledem k tomu, že se převádí správného typu (b).Například v tomto příkladu zachytí pokus o zápis do řetězcový literál v době kompilace:
auto str = L"hello";
str[2] = L'a'; // Compiler error: you cannot assign to a variable that is const
V některých případech mohou být shromážděny identické řetězcové literály uložit místa v spustitelný soubor.V řetězcový literál sdružování, přejděte kompilátoru příčin všechny odkazy na konkrétní řetězcový literál tak, aby odkazoval na stejné místo v paměti namísto každý odkaz na samostatnou instanci řetězcový literál.Chcete-li povolit sdružování řetězec, použijte /GF možnosti kompilátoru.
Konec konkrétní společnosti Microsoft
Zřetězení sousedícího řetězcové literály
Jsou zřetězených sousedícího řetězcové literály.Toto prohlášení:
char str[] = "12" "34";
je stejná jako toto prohlášení:
char atr[] = "1234";
a tohoto prohlášení:
char atr[] = "12\
34";
Pomocí kódů vložený hexadecimální k určení řetězec konstanty může vést k neočekávaným výsledkům.V následujícím příkladu se snaží vytvořit řetězcový literál, který obsahuje znak ASCII 5, za nímž následuje f znaky, i, v a e:
"\x05five"
Skutečný výsledek je hexadecimální 5F, což je kód ASCII pro podtržítkem, za nímž následuje znaky i, v a e.Chcete-li získat správný výsledek, použijte jednu z těchto:
"\005five" // Use octal constant.
"\x05" "five" // Use string splicing.
Řetězcové literály se znaky znakové sady Unicode
Jsou vyjádřeny náhradník dvojice a doplňující znaky (jako u hodnoty UTF-16) \U předpony.Tyto dokumenty wide řetězce, nikoli jednotlivé znaky a jsou vyjádřeny dvojité uvozovky, nikoli do jednoduchých uvozovek.U, u a předpony u8 nejsou podporovány.
const wchar_t* str1 = L"\U0002008A";
const wchar_t* str2 = L"\UD869DED6";
const wchar_t* str3 = L"\Udc00c800";
Další informace o Unicode, naleznete v části Unicode).Další informace o náhradních párech, naleznete v části náhradních párech a doplňující znaky.