Jump to content

    
Arlleex

Плавный переход C -> C++ под МК

Recommended Posts

Приветствую!

Все-таки со временем понимаю, что чего-то не хватает при программировании на Си. Много типового кода, который мозолит глаза лишь своим объемным синтаксисом. Много лишних сущностей, которые хотелось бы скрыть внутри какой-то одной. Отсутствие пространств имен усложняет процесс именования модулей или программных объектов. Давно заметил, что компилятор C++ порождает очень даже оптимальный код. Много интересных механизмов заложено в самом принципе ООП, которые хотелось бы изучить и применять в разработке ПО. В университете был курс по C++, да вот многое я уже тупо забыл. И вот хочу наверстать. Только есть одно но: как осуществить плавный переход? Вот пишу я в Keil uVision 5, все проекты были на Си + asm, весь универсальный код тоже на Си. Что теперь? Создавать проект для C++ и с помощью extern "C" и дальше временно пользоваться всеми наработками, постепенно подмешивая логику уже на C++? Или как? Какую литературу можете порекомендовать для уверенного пользования C++? Хотелось бы, конечно, еще разбираться и в механизмах всех ООП-штучек на бинарном уровне, дабы не удивляться ничему под отладчиком (хотя... когда-то на Си эмулировал виртуальные функции и частично исключения) - я ж дотошный:bb:. Многие пришли в МК сразу со знанием C++, т.к. учились программировать именно на нем. Моя цель - сохранить качество/производительность результирующего бинарного кода при синтаксическом упрощении исходников. Сейчас, как раз, стоит задача (факультативная) написать верхний уровень для сети CAN. Всю логику продумал, все нравится. Но представил, как это будет выглядеть для пользователя (того, что будет юзать тот API - это и я в том числе), как захотелось утащить все в класс и скрыть реализацию, вытащив наружу только некие init(), get()/set() и т.д.

Почему я не перешел на C++ до этого? Да все банально: та литература, которую доводилось читать, не была полна информацией. Например, о неких "делегатах" и "синглтонах" я узнаю, почему-то, на форуме, а не из учебника "В. Пупкин. C++ от А до Я".

Share this post


Link to post
Share on other sites
15 минут назад, Arlleex сказал:

Создавать проект для C++ и с помощью extern "C" и дальше временно пользоваться всеми наработками, постепенно подмешивая логику уже на C++?

Да.

15 минут назад, Arlleex сказал:

Например, о неких ... "синглтонах"

Забудьте о них, если ваши программы должны быть быстрыми. Да, выглядит удобно, но в реализации чудовищно (грубо - в начале каждого обращения идет чтение и проверка статической переменной. Т.е. реально это нужно один раз в момент старта, а тормозит программу всю ее оставшуюся жизнь, до выключения).

Книг не посоветую - сам учил по Страуструпу "язык программирования С++", но она написана скорее для тех, кто уже очень хорошо знает плюсы - основ там нет. Перечитывал раза четыре (пропуская непонятное) и даже в четвертый раз все еще пропускал очень многое.

Share this post


Link to post
Share on other sites

Сергей, спасибо. На просторах сети видел, как некоторые программисты утверждали, что изучали C++ по самому Стандарту, а принципы ООП-организации программ и методологии проектирования изучали вовсе ортогонально по другим источникам. Интересно, насколько такой ход событий вероятен в плане результативности. Для себя сейчас рассматриваю либо уроки на youtube (хотя там тоже надо уметь отсеивать мусорные каналы), либо книги Герберта Шилдта. На полке же у меня валяется куча книг, которые я бросил, не прочитав и 100 страниц (скучны и монотонно-одинаковы), среди которых такие авторы, как Павловская, Подбельский и т.д. Хотя для них, скорее, определяющим фактором, наверное, является моральное устаревание и несоответствие каких-то моментов современным реалиям.

Share this post


Link to post
Share on other sites
41 minutes ago, Arlleex said:

Например, о неких "делегатах" и "синглтонах" я узнаю, почему-то, на форуме, а не из учебника "В. Пупкин. C++ от А до Я".

Есть нормальные книги от спецов с богатым опытом именно в плюсах. Не учебники, а скорее свод правил и личного опыта.

Они мне лично оказались более познавательны, чем нудятина из учебников )))  Рекомендую вот эти:

Р. Мартин - "Чистый код"

Ален И. Голуб - "Веревка достаточной длины, чтобы выстрелить себе в ногу"

также книги Скотта Мейерса

Все равно придется самостоятельно пройти этот путь и найти свой подход, брать чужой за основу можно, но у всех авторов выше он разный.

 

Share this post


Link to post
Share on other sites
1 час назад, Arlleex сказал:

Создавать проект для C++ и с помощью extern "C" и дальше временно пользоваться всеми наработками

extern "C" иногда нужен только для взаимодейтия с кодом на других языках (ассемблер например, или может если код представляет из себя смесь си/си++ кода (не знаю, не делаю так)). Да и то не обязательно: можно прочитать про манглинг имён в с++ и обойтись без extern "C" (я чаще всего так и делаю):

               PUBLIC   _Z10UDivH32L32mm
               THUMB
;u32 UDivH32L32(u32 x, u32 y);
_Z10UDivH32L32mm:
               CLZ      R2, R0
               LSLS     R0, R2
               CLZ      R3, R1
               LSLS     R1, R3
               ...

 

1 час назад, Arlleex сказал:

Сергей, спасибо. На просторах сети видел, как некоторые программисты утверждали, что изучали C++ по самому Стандарту

Я изучал (более 20 лет назад) по некой синей книжице в мягком переплёте. Название "От Си к Си++", авторов не помню.

Поискал сейчас и нашёл её в инете: https://www.goodreads.com/book/show/20319117

В отличие от других вариантов там:

1) нет воды (пустопорожних рассуждений и отступов от темы) многократно раздувающей текст;

2) материал даётся из расчёта, что читатель уже хорошо знаком с си (опять-же - меньше ненужной, уже известной информации);

3) описание каждой сущности идёт вплоть до деталей (например расписан синтаксис явного вызова конструктора для указателя, что не во всякой книге есть; и многое другое);

4) нет новомодных финтифлюшек (типа синглтонов и пр. малополезных сущностей), так как книга довольно старая.

Классы, наследования, перегрузки, полиморфизм и пр. расписаны в деталях, но без воды.

Share this post


Link to post
Share on other sites

Для меня самая полезная книга - Стивен Прата, Язык программирования C++.
https://www.ozon.ru/context/detail/id/7979735/

Я остановился на экспериментальных проектах, пока нет полностью рабочего (уже не знаю, будет ли). Классы, шаблоны использую. И все эти новые штуки C++11. Очень интересно и удобно. 

Приложение И у него очень полезно. Прямо, руководство по переходу на C++.

Share this post


Link to post
Share on other sites
1 hour ago, Arlleex said:

Для себя сейчас рассматриваю...

Есть неплохая книга David West - Object thinking. Она именно об объектно-ориентированном подходе к решению задач. Правда, голова автора забита идеалистической чушью, и поначалу мне это мешало воспринимать эту книгу, но потом я привык просто отбрасывать всю эту шелуху, и стало нормально. Что касается именно самого объектно-ориентированного подхода - с этим у автора всë более, чем хорошо.

Edited by one_eight_seven

Share this post


Link to post
Share on other sites

Всем спасибо, все комментарии для меня весьма полезны, даже если я кого-то не цитирую лично. Полагаю, самым трудным будет только переосмысление подхода к проектированию: нужно уйти от структурного программирования к ООП. Очень часто слышал о том, что новичкам в C++ это даром не дается. Я помню это и по своему переходу с asm на Си, когда я писал под AVR. Поначалу была куча goto, потом пришло некое просветление, что ли. Самое неприятное, ИМХО, это увидеть через год свои потуги и послушать своего внутреннего перфекциониста все это переписать. А через год - итеративно еще раз, а потом еще и так до бесконечности - нет предела совершенству:wink:

Share this post


Link to post
Share on other sites
5 minutes ago, Arlleex said:

 Я помню это и по своему переходу с asm на Си,

asm -> C переход за неделю, а вот на плюсы действительно переходить можно всю жисть ))

Share this post


Link to post
Share on other sites
2 часа назад, Arlleex сказал:

Много интересных механизмов заложено в самом принципе ООП, которые хотелось бы изучить и применять в разработке ПО

"Приёмы объектно-ориентированного проектирования. Паттерны проектирования" уже 20 лет переиздают, хорошая книга

Share this post


Link to post
Share on other sites
2 hours ago, Arlleex said:

Создавать проект для C++ и с помощью extern "C" и дальше временно пользоваться всеми наработками, постепенно подмешивая логику уже на C++? Или как?

У меня конечно большого опыта в С++, как у вышевысказывшихся, но я переводил файла с Си на С++ тек.

В программном модуле на Си перед каждой функцией добавлял имя класса. Например,

было так

void servo_move(int32_t time)
{
  ....
}

Стало так

void cservo::servo_move(int32_t time)
{
  ....
}

Ну, и соответствующие правки в заголовочном файле программного модуля.

Таким образом, программный модуль на Си превращался в класс на С++.

Из книг читал Страуструпа - очень тяжелое чтиво.

А начинал с прочтения Стефан Р. Дэвис. "С++ для чайников" - читается легко, местами с юморком.

Всякими наворотами не пользуюсь. Классы, наследование, иногда перегрузка функций, шаблоны только чужие )))

Share this post


Link to post
Share on other sites
56 минут назад, Leka сказал:

Кому нужно?

Очевидно получается, что мне.

Цитата

Писанины меньше не станет.

Еще как станет. Шаблоны, наследование, инкапсуляция - все это хорошие механизмы сокращения объемов исходников. Пространства имен - отличный способ не тянуть к вызову метода расширение области видимости (::) и название класса - для организации модульности и лаконичности это очень хорошо подходит. Я в Си, допустим, к функциям, объявленным глобально, приписываю префикс, например, can_SendMsg(), dbg_Print(). Однако при увеличении сложности проекта становится больше модулей и, во-первых, называть их хочется кратко, чтобы префикс не позорил всего имени, а во-вторых, появляются модули с чуть ли не одинаковым названием, похожим API и функционалом, но реализующие совсем разные уровни обработки данных. В C++ же я могу объявить пространство имен нужных мне классов и сократить количество мозолей в глазах от лишних cCAN::SendMsg(), cDBG::Print(), записывая просто SendMsg(), Print() в подходящих местах. Т.е. именование становится контекстно-зависимым, а не как в Си - прямым по имени и только лишь.

Share this post


Link to post
Share on other sites
27 minutes ago, Forger said:

Ну, все, началось. Тему можно закрывать 

Про ООП не буду, хочу только затронуть тему рефакторинга.

Когда объем исходников раздувается, переписываю все (не меняя функциональности), с целью в разы сократить объем кода. При таком подходе теряется особый смысл в повторном использовании кода, а ценным становится возможность лаконичного написания с _нуля_.

27 minutes ago, Arlleex said:

все это хорошие механизмы сокращения объемов исходников

Только в смысле повторного использования кода.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.