Arduino ожидал ':' перед токеном '{'

Вчера я хотел скомпилировать проект, который всегда работал до сих пор. Вероятно, после корректировки библиотек (обновления) я больше не мог этого делать. Прошу помощи.

СООБЩЕНИЕ ОБ ОШИБКЕ: статус выхода 1 ожидается ':' перед токеном '{'

Строка из ошибки

#define MSG_PRINT(...) { MSG_PRINTER.print(__VA_ARGS__); }

, 👍-3

Обсуждение

Со всеми этими ошибками компиляции нам следует подумать о переименовании Arduino в Does-Not-Compile. - Вы хоть пробовали гуглить, как определить функционально-подобные макросы и как их использовать?, @Kwasmich

каково значение MSG_PRINT(...) после оценки директивы #define?, @jsotola

Что входит в ваш код непосредственно *перед* использованием MSG_PRINT?, @Majenko


1 ответ


2

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++.

,