Что означает u8R «delim (SomeTextInHere) delim» в C ?

#c #string #c 11

#c #строка #c 11

Вопрос:

Верно, вот кое-что, чего я раньше не видел. Следующий фрагмент кода был найден в исходном виде (хотя я перефразирую, поскольку у меня нет доступа к оригиналу):

 char str[] = u8R"delim(SomeTextInHere)delim";
  

Может ли кто-нибудь на самом деле сказать мне, что это значит и какой эквивалент был бы в C?

Комментарии:

1. Если кто-то написал это в дикой природе, они сумасшедшие.

Ответ №1:

Я не знаю, как перевести это на C, сэр, но это приводит к появлению почти всех новых материалов, связанных с литералами, в одном примере.

 u8: utf-8 string literal.
R: Raw string literal (no escape characters)
"delim(" ... ")delim": The prefix and suffix of the raw string literals. 
                       They are used as delimiters, and you can write your own.
  

Комментарии:

1. Моего отца звали «сэр», вы можете просто называть меня пакс 🙂

Ответ №2:

Эквивалента в C пока нет. Это функция C 11, которая сочетает в себе две вещи.

u8 Префикс означает, что строка будет закодирована в UTF-8. R Префикс означает, что это необработанный строковый литерал. Объединение их означает, что исходная строка будет закодирована в формате UTF-8.

Необработанные строки — это способ обойти все экранирования, необходимые для регулярных выражений и так далее. Обычно в регулярном выражении приходится использовать много символов «». Но это escape-символ C / C , поэтому в строковых литералах вместо него нужно использовать «». Необработанные строковые литералы позволяют избежать этого. В необработанных строках нет управляющих символов.

Способ работы необработанного строкового литерала заключается в следующем. За R префиксом следует " , как обычно. Но все символы до первого ( символа считаются частью разделителя необработанной строки. Итак, если вы начинаете необработанную строку с R"foo( , строка будет продолжаться до тех пор, пока анализатор не увидит, )foo" .

Таким образом, вы можете использовать " , и практически любые другие символы, если вы выберете свои разделители. Разделитель тоже может быть пустым, поэтому R"(some stuff)" эквивалентен "some stuff" . Он заканчивается, когда он видит )" .