Arduino ожидал ':' перед токеном '{'
Вчера я хотел скомпилировать проект, который всегда работал до сих пор. Вероятно, после корректировки библиотек (обновления) я больше не мог этого делать. Прошу помощи.
СООБЩЕНИЕ ОБ ОШИБКЕ: статус выхода 1 ожидается ':' перед токеном '{'
Строка из ошибки
#define MSG_PRINT(...) { MSG_PRINTER.print(__VA_ARGS__); }
@user11528497, 👍-3
Обсуждение1 ответ
MSG_PRINT
— это макрос. Он заменяется в вашем коде дословно перед компиляцией.
Сообщение об ошибке даст вам дополнительную информацию. В частности, он сообщит вам, где ошибка. Например:
/tmp/untitled1/untitled1.ino: In function 'void loop()':
/tmp/untitled1/untitled1.ino:1:24: error: expected ':' before '{' token
/tmp/untitled1/untitled1.ino:12:13: note: in expansion of macro 'MSG_PRINT'
Здесь я определил MSG_PRINT
в строке 1, где он "говорит" об ошибке. Однако это только там, где макрос. Фактическая ошибка находится в строке 12, где ошибка говорит, что макрос расширяется. Это последняя строка сообщения об ошибке.
Небольшой фрагмент кода, который я использовал для срабатывания этой ошибки, на самом деле представляет собой команду switch
, в которой я намеренно пропустил :
в конце оператора case:
switch (v) {
case 3 // <---- здесь отсутствует двоеточие
MSG_PRINT("foo");
break;
}
Если мы заменим MSG_PRINT
в качестве препроцессора, мы получим:
switch (v) {
case 3
{ Serial.println("foo"); }
break;
}
(я определил MSG_PRINT
, чтобы просто вызывать Serial.println
...), и теперь мы можем лучше видеть контекст ошибки.
Теперь с расширением очевидно, что :
действительно отсутствует перед {
, даже несмотря на то, что этот {
не сразу видно в вашем коде.
Умение интерпретировать эти иногда загадочные сообщения об ошибках является ключом к работе с C и C++.
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Со всеми этими ошибками компиляции нам следует подумать о переименовании Arduino в Does-Not-Compile. - Вы хоть пробовали гуглить, как определить функционально-подобные макросы и как их использовать?, @Kwasmich
каково значение
MSG_PRINT(...)
после оценки директивы #define?, @jsotolaЧто входит в ваш код непосредственно *перед* использованием
MSG_PRINT
?, @Majenko