Необработанный строковый литерал 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://-/, программу можно скомпилировать, так как теперь в необработанном строковом литерале нет //

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

, 👍2


1 ответ


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», но это единственное изменение, которое я внес.

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

,