Можно ли настроить компилятор С++ для поиска другого идентификатора строкового литерала?

Сейчас 2023 год, и я думаю, что это глупо, что идентификатор строки — это то, что так часто встречается в тексте, а также в других языках, таких как разметка.

C++ использует символ " для обозначения начала и конца строки.

Есть ли способ сделать этот символ чем-то другим?

Например, \xac, который также является 1-байтовым символом.

Например, если бы идентификатор строки был чем-то отличным от двойной кавычки, то использование функции system() было бы намного проще в использовании, где двойные кавычки пригодились бы очень кстати.

Это относится и к чему-то вроде PHP. Я использую echo '<div class = "adiv"></div>' с одинарными кавычками, чтобы писать что-то внутри с помощью двойных кавычек, но иногда мне нужно иметь возможность использовать как двойные, так и одинарные кавычки.

Действительно ли мы ограничены кавычками и двойными кавычками в качестве разделителей? Разве мы не можем использовать или установить пользовательский символ, который больше нигде не появляется?

Если это выполнимо, пожалуйста, скажите мне, как. Если это несбыточная мечта, дайте мне знать.

//Example: (I know the character I'm about to use is 3-bytes (\xe2\x81\x91) but just for demonstration...

#include <iostream>

int main() {

  std::cout << ⁑Hello world!\n⁑;
  system(⁑echo -e '"hello\nworld"' | grep 'hello' | sed s/'"hello'/'"Hello!"'/⁑);

return 0;
}

Я пробовал искать многие страницы (разбивки на страницы?) Google, и я даже не могу найти никого, кто задал вопрос.

Вместо этого, возможно, вы захотите использовать литерал необработанной строки: https://stackoverflow.com/questions/56710024/what-is-a-raw-s‌​tring

drescherjm 19.02.2023 00:51

Если проблема, которую вы описываете, заключается в том, что «[quote] — это то, что так часто встречается в тексте», ее решением является необработанный строковый литерал. R"(echo -e '"hello\nworld"')"

Drew Dormann 19.02.2023 00:56

Говоря с точки зрения конструкции компилятора, лексирование строковых литералов происходит очень рано. Включение чего-то в сам код, чтобы изменить это, было бы довольно раздражающим, учитывая, что на данный момент код представляет собой суп из символов. Однако даже параметр компилятора потенциально может привести к тому, что DFA, созданный во время компиляции (в компиляторе, а не в вашей программе), станет средой выполнения или сохранит большую часть предварительно созданного DFA и будет иметь другой особый случай для строковых литералов, которые должны быть обработаны. с отдельно. (Хотя высококачественные компиляторы, вероятно, все равно лексируют вручную, вариант DFA по-прежнему подходит для 90%+.)

chris 19.02.2023 01:08

Вы ищете escape-символ \ ? например char const * three = "\"three\"";

QuentinUK 19.02.2023 01:14

«использование функции system() было бы намного проще» — упрощение использования system() не должно быть целью — на самом деле совсем наоборот. Эта функция — кошмар безопасности, и ее никогда не следует использовать в новом коде (а старый код следует реорганизовать, чтобы избавиться от нее).

Jesper Juhl 19.02.2023 02:58

@JesperJuhl, что бы вы порекомендовали на его место? Я хочу научиться манипулировать файлами в моей системе, используя bash для склеивания моего кода на С++. В любом случае, bash - это не просто клей? Также вы знаете, что даже если это плохой пример, моя точка зрения остается в силе......

ED818 19.02.2023 03:11

@ED818 В Windows CreateProcessEx(), в системах на базе Unix fork() + exec() (или один из его вариантов). В обоих случаях вы получаете контроль над тем, в какой среде запускается новый процесс, какая оболочка (если таковая имеется) будет использоваться, вы можете взаимодействовать с потоком stdin процесса, вы можете получать доступ к потокам stdout и stderr процесса по отдельности и многое другое. С system() вы отказываетесь от всего этого контроля и даете злоумышленнику множество вариантов, чтобы манипулировать тем, что вы пытаетесь выполнить.

Jesper Juhl 19.02.2023 09:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю вашу проблему, это можно легко решить, используя необработанные строковые литералы, например:

std::string myStr = R"('Using single quotes', "double quotes")";

Все, что находится внутри этих скобок от "( до )", будет рассматриваться как строка, и вы можете написать все, что захотите, внутри этой строки, даже написать многострочную строку без \. Обратите внимание, что такие символы, как \n, \r, также будут рассматриваться не как «новая строка» или «возврат каретки», а как они написаны.

"в этой строке вы можете написать что угодно" - ну, почти что угодно. В вашем примере строка не может содержать последовательность символов )", иначе строка преждевременно порвется. Если вам нужны эти символы, вам нужно будет указать собственный разделитель для различения, например: std::string myStr = R"delim('Using single quotes', "double quotes", and even )" too)delim";

Remy Lebeau 19.02.2023 04:03

Другие вопросы по теме