Необработанный строковый литерал Arduino IDE C++ 11 имеет проблемы с // в http://, компилятор считает, что // это комментарий

char webpage[] PROGMEM = R"=====( 
<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js"></script>
  </head>
  <body>
  </body>
</html>
)=====";

Я обнаружил проблему при использовании необработанного строкового литерала в Arduino IDE. Мой код не может скомпилироваться, если внутри строки есть ссылка http://.

Я обнаружил, что это должно быть связано с тем, как Arduino IDE считает, что строка после // является комментарием, и во время компиляции эта строка игнорируется, и мои коды ломаются.

Похоже, что компилятор Arduino IDE сначала удаляет все //комментарии в коде, прежде чем попытаться скомпилировать необработанный строковый литерал, а затем вызвать проблему.

В качестве теста я пытаюсь отладить ее, изменив свой код на https://-/, программу можно скомпилировать, так как теперь в необработанном строковом литерале нет //

Есть ли обходной путь?

, 👍3


3 ответа


3

Измените две кавычки внутри строки, используя обратную косую черту (буквальные кавычки).

Без escape-символов URL-адрес находится «за пределами» строки, поскольку кавычки являются разделителями строк.

char webpage[] PROGMEM = R"=====( 
<html>
  <head>
    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js\"></script>
  </head>
  <body>
  </body>
</html>
)=====";
,

Спасибо. интересный. после выхода из «он может соответствовать, но ссылка больше не работает» потому что в html ссылка src больше не может указывать на местоположение ссылки, так как перед ней есть дополнительный escape-символ \", @Ho Chung Law

Экранирующие символы не остаются в конечном результате, у вас есть другая проблема, например, вы не можете ссылаться на внешний контент при обслуживании непосредственно с ESP8266/ESP32, потому что у него нет подключения к Интернету, которое могло бы позволить вашему устройству загрузить Ресурсы., @Avamander

Это просто упрощенный фрагмент кода. Моя исходная программа будет обслуживать страницу JavaScript. Я опубликую свой полный код позже., @Ho Chung Law

Для необработанного строкового литерала c11 конечный результат будет содержать escape-символы. Значение \" в необработанном строковом литерале будет по-прежнему отображаться как \", @Ho Chung Law


3
char webpage[] PROGMEM = R"=="==( 
<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js"></script>
  </head>
  <body>
  </body>
</html>
)=="==";

Вдохновленный ответом @jsotola, если бы я использовал такой синтаксис R"=="==()=="==", ссылка окажется внутри кавычки. и, следовательно, компилятор IDE рассматривает это как строку и не будет думать, // что это комментарий, и теперь код может соответствовать требованиям, и ссылка работает.

,

0

C & Компиляторы C++ не ищут синтаксис языка внутри строк в кавычках (за исключением escape-символов, таких как '\n'). В этом и смысл цитирования строки.

Эта программа только что скомпилирована. Хорошо:

const char webpage[] PROGMEM = R"=====( 
<html>
  <head>
    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js\"></script>
  </head>
  <body>
  </body>
</html>
)=====";

void setup() {
}

void loop() {
}

'//' внутри строки не вызвало никаких проблем. В вашем примере появилось сообщение об ошибке, что переменная «веб-страница» должна быть константной, чтобы поместить ее во флэш-память, поэтому я добавил ключевое слово «const», но это единственное изменение, которое я внес.

Если вы это сделали, а ваш компилятор все еще жалуется, значит, проблема не в '//'.

,