Собственно не знаю, можно ли это именно к Вам отнести (или как-то более расширено) - думаю совместно с администрацией форума можно будет в дальнейшем вопрос решить.
А вопрос у меня вот какой (наверное не всем интересный):
В среде ардуино используется Си++ и ООП.
В нативных средах микроконтроллеров это либо ассемблер, либо Си (без ++).
Соответсвенно нет там никаких прекрас из объектов и тп.
Но в основном же там (в библиотеках, что хочется переписать на Си) и ООП как таковое не используется «на всю мощь». Что там делают - объект для кнопки, или светодиода или тп.
Получается такие «объекты» (без полиморфизма, и зачастую без наследования) можно переписать под обычный Си.
Вот и вопрос: Как правильно это сделать?
Для примера можно взять полюбившуюся мне библиотеку кнопок (kakmyc_btn). Ссылка на GitHub.
Думаю еще нужно добавить, Хотя Вы и сами это знаете и понимаете, что millis() можно легко заменить своей функцией на таймере. Вопрос к этому не относится.
Почему? Разве МикрочипСтудия - не нативная среда? Там С++ в полный рост.
Что? Переписать на С? Не, я столько не выпью. Это надо @Kakmyc просить.
Да и не люблю я этот С. Мне больше нравятся функциональные языки. Там программирование в виде близком к чистому искусству. Они ж там не связаны требованием высокой производительности, там такие возможности есть, что и С++ – то ни в каком кошмаре не снилось, а С – это же, с точки зрения программирования, совсем утилитарное убожество – только «проги кодить». Я ведь не «кодю» я самовыражаюсь, для меня это поэзия. Я как-то вот тут человеку объяснял, не зна, понял ли он. Кстати, пример о котором я там говорил, могу живьём показать.
К сожалению не знаю какую именно версию используете Вы, но скачанная последняя версия на начало ноября предлагала только XC компилятор, который (как Вы знаете) С++ не поддерживает. Я, честно говоря, её и не использую (если микрочип - то у меня MPLAB X IDE стоит). Но всё же…
Евгений Петрович, я Вас услышал. Могу ли я попросить данную тему не закрывать и не удалять, на случай если что-то спросить в переделке с С++ на С или Вы вообще не хотите с подобным «связываться»?
Общая схема проста:
ключевое слово class превращаем в struct избавляя от ключевых слов С++ типа private/public.
И далее все методы вида:
type MyClass::methodName( params… )
превращаем в функции по шаблону
type MyClass_methodName( MyClass *this, params… )
и посему вызовы вида
myVar.methodName( params… );
превращаем в вызовы функций вида
MyClass_methodName( &myVar, params… );
и всё.
То есть все “методы” просто имеют первый параметр - указатель на структуру бывшую в С++ классом и внутри тела метода имеющий название this (он уже не вменяется по умолчанию - имя тоже надо явно проставить в местах использования).
При использовании конструкторов/деструкторов и операторов чуть больше надо повозится раздав им символьные имена и явно проставив вызовы, но в целом конверсия проста и прямолинейна - если класс не ООП-нутый, а чисто прячет за фасадом ключевого слова class процедурное программирование, то можно прям транслятор написать автоматически превращающий код из С++ в код на С.
Собственно когда Страуструп создавал C++ он поначалу не писал какой то совершенно новый компилятор - он писал транслятор который превращал код на C++ в код на Си подстановками одних конструкций в другие по шаблону. Это уже потом профессиональные компиляторы научились обходится промежуточного этапа.