Sdílet prostřednictvím


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.

Viz také

Referenční dokumentace

Literály jazyka C++