бессмысленным и непрактичным абсурдом, что здесь
void foo() {
auto x = R"(
[config]
hello = Hello, World
answer = 42
)";
}
значение x разворачивается в
[config]
hello = Hello, World
answer = 42
а не в
[config]
hello = Hello, World
answer = 42
?
Может, нам нужен новый тип сырого литерала, который дружит с форматированием кода?
Возможно у кого-то очень хитрый макрос, который позволяет нормально сделать
можно выделить каждую строку в отдельные "". У тебя все верно, в строке есть и переход на новую строку и табы (4 пробела, вероятней). Ну и склеить их в 1 строку сразу
С другой стороны, не очень понятно, как тогда втыкать туда ws так, чтобы оно не считалось форматированием.
Я как бы намекаю, что сырые литералы были созданы для удобства – чтобы можно было просто взять и скопировать текст в/из кода, не убирая и не добавляя спецсимволы И теперь оказывается, что для многострочных строк они не применимы вообще и тогда, собственно, хочется спросить, а зачем их вообще научили в многострочность?
в каком смысле многосторонность, для компилятора у тебя 1 большая строка, а не форматированный код, ты не просто так ставишь эти ;
У меня пока такая черновая идея: обрезаем сверху один \n, если он есть и один \n\s* снизу, а потом находим самый левый непробельный символ среди всех строк и обрезаем каждую строчку с начала и до него. Кажется, это должно работать внятно в общем случае
Пожалуй. Но, в целом, тоже не особо очевидно.
auto x = R"(\n [config]\n hello = Hello, World\n answer = 42\n)"; во какая у тебя строка
Это мы и так знаем, спасибо. Тут разговор о том, что это не удобно и не практично.
>> для компилятора у тебя 1 большая строка В текстовом редакторе это всё ещё несколько строк. И это понимание строк ближе к семантике, чем грамматика языка. Поэтому в вопросе осмысленности языковых фич я предлагаю судить с позиции семантики – она первична
я думаю это вопрос к иде, а не синтаксису
Можно научить текстовый редактор визуально индентить
чтобы текст на экране отличался от текста в файле 😱
Можно, но мне не понятно, почему это должен делать именно текстовый редактор
а как твой \n для красоты отличить от \n для дела, ты вообще то литер тут обьявляешь. Почему когда я объявляю большой uint, я не могу указать сразу сколько там знаков, типо uint i = 473828827272 12; Так ведь удобно
uint i = 473828827272'12;
В жадном регексе нельзя будет завершать последнюю строку переносом.
>> а как твой \n для красоты отличить от \n для дела Я выше написал черновую эвристику, предполагающую, что первый \n в начале – всегда для красоты. Если нужен ещё один для дела – можно добавить ещё одну строчку в коде. И почти аналогично с концом литерала
Всё ещё можно, понадобится просто на строчку больше. Или я не понял суть
так можно "hdhdje" + "jdjdjdjdj"
\n\s* сожрёт все пробельные символы после крайнего непробельного. Я про это.
Вот только это не raw literal.
Нам это нужно как раз из-за того, что завершение сырого литерала – это обычно не просто перенос строки, а ещё несколько табов/пробелов перед )";, как в моём примере. Или имеется ввиду, что последующие \n – это тоже пробельные символы?
Обсуждают сегодня