Вы столкнулись с макросом препроцессора , и вам придется изменить имя переменной. sp
должно быть безопасным для использования.
Не используйте ALLCAPS для имен переменных. По соглашению ALLCAPS зарезервирован для констант, и в первые дни C единственный способ получить константу был с помощью макроса препроцессора, представляющего литерал. Если вы будете следовать соглашению, шансы на то, что один из ваших идентификаторов столкнется с макросом и будут заменены, значительно уменьшатся.
TL; DR Version
Где-то в одном из заголовочных файлов библиотеки Arduinio есть в конечном итоге, что-то вроде
#define SP ((*(volatile unsigned int *)0xNN)
, которое принимает NN, число, представляющее смещение регистра SP, и превращает его в нечто, что программа C или C ++ может использовать проще. Это сделано для того, чтобы вы могли посмотреть на текущий указатель стека, если хотите (возможно, для отладки).
#defines
- простая текстовая подстановка. Когда SP
найден, он заменяется ((*(volatile unsigned int *)0xNN)
. Таким образом,
Leg(int SP, int EP)
преобразуется после того, как вы видите его в
Leg(int ((*(volatile unsigned int *)0xNN), int EP)
до того, как компилятор его видит. Компилятор не может разобрать этот беспорядок, поэтому вы получаете сообщение об ошибке, которое не соответствует написанному вами коду. Получается много веселья.
Это звучит как кошмар, и может быть, но иногда макросы являются лучшим инструментом для работы. Подробнее о макросах и о том, как их использовать, не попадая в более распространенные ловушки: Почему макросы препроцессора являются злыми и каковы альтернативы? ?
Самое простое, что вы можете сделать, это придерживаться соглашения и никогда не использовать идентификаторы ALLCAPS, кроме случаев определения макроса. Если вы используете sp
вместо SP
, вы, вероятно, в безопасности.
Копая вывод препроцессора какого-то старого кода Arduino, я нахожу
#define SP _SFR_IO16(0x3D)
Что приводит к
#define _SFR_IO16(io_addr) _MMIO_WORD((io_addr) + __SFR_OFFSET)
и
#define _MMIO_WORD(mem_addr) (*(volatile uint16_t *)(mem_addr))
Так что мое первоначальное предположение немного сбилось, но результат тот же.