При попытке компиляции проекта написанного в Arduino IDE, можно не мало удивиться количеству ошибок и предупреждений которые выдаст компилятор при попытки сборки проекта. Хотя в Ардуино все компилировалось и работало без проблем.
Ошибки не слишком серьезные, и я бы не стал их считать минусом Arduino IDE.
Список будет пополнятся по мере их обнаружения.
сomparison between signed and unsigned integer
Сравнение знаковой и без знаковой переменной. Например будут равны при сравнении
int -1 и unsigned int 65535, -2 и 65534, и так далее. Обе переменные должны быть одного типа.
suggest parentheses around '&&' with in '||'
Не проставлены скобки однозначно указывающие на порядок сравнения значений.
Например: if ((AC) || (A>D) && (B>D)) должно быть ( ((AC)) || ((A>D) && (B>D)))
control reaches end of non-void function
Оператор return отсутствует либо находится не в основном блоке функции.
То есть если return есть, но находится в блоках if или case, то в конце основного блока так же необходимо
поставить return.
This decimail constant is unsigned only in ISO C90
К константе типа unsigned long необходимо добавить суффикс UL. Например const unsigned long value = 2587856UL;
non-static data member initializer only aviable with -std=c++11 or -std=gnu++11
Инициализацию полей класса необходимо проводить в конструкторе.
В Arduino IDE есть возможность проинициализировать переменные прям в описании класса, что довольно удобно,
когда пишется пробный класс и пока не понятно, переменные будут инициализированы в конструкторе или Set методом.
Variable -sized object 'name' may not be initialized
Компилятор опасается, что массив вида int name[value]; окажется с нулевым количеством ячеек.
Можно принудительно увеличить количество ячеек int name[value+1];
Можно создать указатель и ему присвоить созданный массив. На эту ошибка ругался Code::Block, Studio ее пропускал.
invalid conversion from 'void*' to ' Window_Rectangle'
Когда указатель на объект был сохранен в указателе с типом void, или в массиве указателей с таким же типом,
при присвоении новому указателю из массива void (pointer_obj[n]) необходимо выполнить явное приведение указателя.
Синтаксис аналогичен приведению переменных.
Window_Rectangle *rectangle = pointer_obj[n]; // Допустимо в Ардуино.
Window_Rectangle *rectangle = ((Window_Rectangle*)pointer_obj[n]); // Приведение указателя
Но стоит отметить, в пользу Arduino IDE, настройки компилятора подобраны таким образом,
что у начинающего не возникает проблем при работе с портами, и регистрами контроллера, обращаясь к ним как угодно,
сдвигая их или маскируя биты, в цикле или с большим количеством case. Для компилятора, обращение к порту,
как к глобальной переменной, только переменную можно указать volatile и спокойно ехать дальше, а к макро-определению PORTn
такого не применить, когда обращений к порту не много, все норм, когда идет пачка в более 50 case, компилятор начинает
оптимизацию и начинаются нюансы...
Так же стоит отметить в Ардуино всегда корректную работу с глобальными переменными,
нет нужды беспокоится что что-то не отмечено как volatile. Вероятно все настроено под небольшой проект.
Скетч и несколько подключенных библиотек.