Необработанный строковый литерал 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://-/, программу можно скомпилировать, так как теперь в необработанном строковом литерале нет //
Есть ли обходной путь?
@Ho Chung Law, 👍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>
)=====";
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 рассматривает это как строку и не будет думать, // что это комментарий, и теперь код может соответствовать требованиям, и ссылка работает.
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», но это единственное изменение, которое я внес.
Если вы это сделали, а ваш компилятор все еще жалуется, значит, проблема не в '//'.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- DateTime в строку
- Как преобразовать строку в массив байтов
- Как отправить строку на мастер с помощью i2c
- Создание форматированной строки (включая числа с плавающей запятой) в Arduino-совместимом C++
Спасибо. интересный. после выхода из «он может соответствовать, но ссылка больше не работает» потому что в html ссылка src больше не может указывать на местоположение ссылки, так как перед ней есть дополнительный escape-символ \", @Ho Chung Law
Экранирующие символы не остаются в конечном результате, у вас есть другая проблема, например, вы не можете ссылаться на внешний контент при обслуживании непосредственно с ESP8266/ESP32, потому что у него нет подключения к Интернету, которое могло бы позволить вашему устройству загрузить Ресурсы., @Avamander
Это просто упрощенный фрагмент кода. Моя исходная программа будет обслуживать страницу JavaScript. Я опубликую свой полный код позже., @Ho Chung Law
Для необработанного строкового литерала c11 конечный результат будет содержать escape-символы. Значение \" в необработанном строковом литерале будет по-прежнему отображаться как \", @Ho Chung Law