LINUX.ORG.RU

Посоветуйте хороший проект на c++ для изучения

 , , ,


3

4

Добрый день.

Хочу (в очередной раз) немного вкатиться в плюсы. Для этого хотелось бы поизучать какой-нибудь опенсурсный проект на предмет стиля оформления кода, разбивки его на модули, обработки ошибок, использования умных указателей и пр. Неплохо бы, если проект существует в реалиях c++17 и новее.

На что по вашему мнению стоит обратить внимание?

Ответ на: комментарий от dataman

Много-то – оно понятно. Но я сам не определю, насколько проект годно написан именно с точки зрения написания его на плюсах. Потому и создал тему.

apt_install_lrzsz ★★★
() автор топика

Мне кажется это глупость. Как это должно выглядеть? Открываешь и читаешь подряд все файлы вслух, пока не поймешь как проект полностью работает? Так в сложном проекте может даже не все авторы это понимают, куда уж новичку. Ты годами будешь пытаться разобраться в чужих проектах и толку не будет.

Думаю лучший путь обучения – это начать писать что-то свое. И по ходу дело подсматривать как реализованы те или иные фичи в других проектах.

опенсурсный проект на предмет стиля оформления кода

Выбрать любой вариант из clang-format и использовать только его.

MoldAndLimeHoney
()
Ответ на: комментарий от MoldAndLimeHoney

И по ходу дело подсматривать как реализованы те или иные фичи в других проектах.

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

apt_install_lrzsz ★★★
() автор топика

WebKit поизучай. Там сейчас C++23, и код поддерживается в чистоте и соответствии последним стандартам. Про умные указатели можно здесь почитать: https://docs.webkit.org/Deep Dive/MemoryManagement.html. Реализации множества хороших ADT можно найти в https://github.com/WebKit/WebKit/blob/main/Source/WTF/wtf. Например, вот аналог std::function, реализация простая, но при этом ещё и исправляется фатальный недостаток оригинала: WTF::Function является move-only типом, так что его нельзя случайно передать по значению и таким образом вызвать копирование полей замыкания.

annulen ★★★★★
()
Ответ на: комментарий от annulen

WebKit поизучай. Там сейчас C++23

Кстати, в https://github.com/stephenberry/glaze – тоже.

Ещё хорошие примеры:
https://github.com/foonathan/lexy
https://github.com/marzer/tomlplusplus
https://github.com/martinus/nanobench

Ну и Qlibs++ -- header-only библиотеки для C++20 :).

dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 2)

Будет звучать как выпендрёж, но нигде красивый код на крестах не видел.

какой-нибудь опенсурсный проект на предмет стиля оформления кода, разбивки его на модули, обработки ошибок, использования умных указателей и пр. Неплохо бы, если проект существует в реалиях c++17 и новее.

Из вот этого перечня можно мб половину пунктов за раз увидеть.

Если кто-то думает, что я не прав, и если не лень - предъявите контрпримеры, пожалуйста.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

Будет звучать как выпендрёж, но нигде красивый код на крестах не видел.

Я вот видел. Примерно в двух проектах за всю карьеру, одним из них был мой дипломный проект :3

ТС, смотри сырцы движка Doom 3. Там весьма годный код, хоть и старый (уровня C++03).

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)

Везде по-разному. Например начитаешься гугловских проектов, в которых исключения запрещено использовать и что ты оттуда вынесешь? Гугловский маразм по отказу от исключений.

Кресты — старый язык. Это в джаваскрипте есть мейнстрим. В крестах разброд и шатание.

Ещё кресты 98 стандарта и 11+ две разные разницы. 98 стандарт лучше не смотреть, там мрак.

ox55ff ★★★★★
()

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

Если тебе нужна именно эта мишура, то скорее всего только свой проект - там можно полировать стиль и обкатывать новые фичи сколько угодно. В любом популярном проекте по определению будет легаси и смешение стилей и определённая консервативность.

anonymous
()
Ответ на: комментарий от ox55ff

Если разрешены исключения, то это совсем другой язык получается. К сожалению, далеко не все пишущие на C++ это осознают. Это я не про тебя, если что. Надеюсь, ты осознаешь? Не так ли?

anonymous
()
Ответ на: комментарий от ox55ff

Гугловский маразм по отказу от исключений.

Это позиция школьника-олимпиадника, наивного олуха с нулевым опытом и без набитых шишек вообще.

Со временем понимаешь что это нисколько не маразм, и кресты вообще надо максимально ограничивать, если вообще их использовать приходится.

lovesan ★★★
()
Ответ на: комментарий от lovesan

Со временем понимаешь что это нисколько не маразм, и кресты вообще надо максимально ограничивать, если вообще их использовать приходится.

А это позиция ковырятеля в вакууме никому не нужных поделок на несуществующих язычках, прода в жизни не видевшего.

Со временем работы с язычком без исключений понимаешь насколько же они единственное правильное решение и насколько чище и проще делают код.

anonymous
()
Ответ на: комментарий от lovesan

Гугловский маразм по отказу от исключений.

Это позиция школьника-олимпиадника, наивного олуха с нулевым опытом и без набитых шишек вообще.

Со временем понимаешь что это нисколько не маразм, и кресты вообще надо максимально ограничивать, если вообще их использовать приходится.

Мой опыт работы в крупных компаниях показывает, что такие решения могут принимать два-три человека, высоких начальника, которые не особо спрашивали тех, кто сейчас активно код пишет. Говнокодить можно и с исключениями и без. Отказ - это популизм и ни что иное.

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

еще бы кого-то спрашивать

крестолюбцев спросишь - они тебе насуют нечитаемого говна из experimental, разной хероты типа буста, и прочего говна, так что код будет тормозить, течь, и будет абсолютно нечитаемым и неподдерживаемым

lovesan ★★★
()

я спросил у тополя! вот что ответил чатгпт на вопрос - дай мол примеры хорошего с++ стиля с гитхаба.

Here are some examples of C++ projects on GitHub that demonstrate good code style and practices:

    Google Test
        Repository: google/googletest
        Description: Google’s C++ test framework. This project follows best practices in naming conventions, organization, and documentation.

    C++ Core Guidelines
        Repository: isocpp/CppCoreGuidelines
        Description: A collection of guidelines for writing high-quality C++ code. The repository includes examples and explanations of good practices.

    Catch2
        Repository: catchorg/Catch2
        Description: A modern, C++-native, header-only test framework for unit testing. The code follows consistent style, and the documentation is thorough.

    OpenCV
        Repository: opencv/opencv
        Description: OpenCV is an open-source computer vision library. The codebase is well-structured, and it follows good practices in terms of modularity and documentation.

    fmt
        Repository: fmtlib/fmt
        Description: A modern formatting library for C++. The project uses consistent naming conventions and provides clear documentation and examples.

    Poco C++ Libraries
        Repository: pocoproject/poco
        Description: A collection of C++ libraries that simplify network programming and other common tasks. The code is well-organized and adheres to good coding practices.

    SFML (Simple and Fast Multimedia Library)
        Repository: SFML/SFML
        Description: A multimedia library for C++ that provides a simple interface to various components. The project has a clean structure and follows good coding standards.

    libcurl
        Repository: curl/curl
        Description: A command-line tool and library for transferring data with URLs. The code is well-documented and follows consistent style guidelines.

    Boost Libraries
        Repository: boostorg/boost
        Description: A collection of portable C++ source libraries. The Boost libraries follow high-level design principles and provide extensive documentation.

    Cinder
        Repository: cinder/Cinder
        Description: A C++ library for creative coding. The project has a clean structure, uses modern C++ features, and is well-documented.

Tips for Exploring Projects

When exploring these repositories, pay attention to:

    Code Structure: How files and directories are organized.
    Naming Conventions: Consistency in naming classes, functions, and variables.
    Documentation: Quality and clarity of comments and README files.
    Testing: How unit tests are structured and implemented.
    Use of Git: Commit messages, branching strategies, and overall version control 
practices.

These projects can serve as excellent references for writing clean, maintainable, and efficient C++ code.
alysnix ★★★
()

Я не эксперт в плюсах, но как я понял, код SerenityOS прям очень хорош. Похоже, автор словил словил неимоверный Пик Балмера. Там много проектов на любой вкус под крылом ОС: браузер, различные пользовательские программы, JIT, эмулятор, своя STL и т. д.

urxvt ★★★★★
()
Ответ на: комментарий от lovesan

Со временем понимаешь что это нисколько не маразм, и кресты вообще надо максимально ограничивать, если вообще их использовать приходится.

Ксо жалению, отказ от исключений подразумевает отказ от большей части плюсовой экосистемы. Стандартную библиотеку, Qt и кучу другого кода можно сразу выкидывать, они на такое не рассчитаны.

Такой подход работает только у гугла и подобных копрораций и только потому что они могут позволить себе писать всё с нуля.

hateyoufeel ★★★★★
()
Ответ на: комментарий от urxvt

Я не эксперт в плюсах, но как я понял, код SerenityOS прям очень хорош. Похоже, автор словил словил неимоверный Пик Балмера

тоже не эксперт в плюсах, но прям-таки заинтересовался и посмотрел..

на мой скромный взгляд «Пик Балмера» оказался вылит(вкопан?) в некую альтернативу STL. namespace AK:: и в нём свои массивы, вектора и прочии шаблоны.

весь остальной код, это Cи-с-классами и AK::* вместо STL

Архитектура ОСь может и хороша, но не как пример C++. Скорее анти-пример «так делать нельзя». Велосипеды и так нехорошо, а второй stl подавно

MKuznetsov ★★★★★
()
Ответ на: комментарий от hateyoufeel

вся эта «экосистема», особенно опенсорсная, и гроша выеденного не стоит, говно она бесполезное, одним словом

если нужна развитая экосистема, надо подаваться в жабу или дотнет

lovesan ★★★
()
Ответ на: комментарий от lovesan

если нужна развитая экосистема, надо подаваться в жабу или дотнет

Так и представил себе гуй на жабе или дотнете под линукс. Сразу так тепло на душе стало (от нагревающегося процессора в ноутбуке).

Пока что Qt – самый адекватный фреймворк для интерфейсов. Нет, меня этот факт тоже крайне не радует, но такова жизнь.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от urxvt

под крылом ОС: браузер

Ladybird будут переписывать на Swift, как только в его поставке будет более свежий clang.
Так что начинайте изучать Swift заранее. :)

dataman ★★★★★
()
Ответ на: комментарий от lovesan

WPF/Avalonia это тормозное убогое говно по сравнению с Qt.

Кстати, а куда делись все графические фреймворки на Common Lisp?

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)

DC++ (https://sourceforge.net/projects/dcplusplus/files/DC++ 0.882/) имеет относительно небольшую кодовую базу, не смотря на то что сам проект начался очень давно, код написан на современном C++. Мне было интересно подчерпнуть там идеи реализации для плагин подсистемы, понравилось то как некоторые вопросы они решают через взятие Сишных структур из WinApi, расширения их до C++ классов через наследование с инкапсклированием необходимой им функциональности в методах этого класса. Еще понравилось то что не смотря на то что рекомендуют MinGW проект можно собрать в VisualStudio, ну например у меня сложилось впечатление (вернее не впечатление а замеры скорости работы stl на сверхбольших данных), что программы компилируемые MSVS быстрее* на Винде чем mingw-gcc (с макс оптимизациями и там и там), поэтому предыдущую версию DC++ я успешно собрал в MSVC и использовал вместо официального бинарника, до новой руки пока не дошли.

* - это я именно про mingw говорю, так мой тот же бенч на той же версии gcc что и в mingw в Linux нативно немногим пошустрее в чем-то (std::sort) , в чем-то одинаково или чуть медленее (map, set), но mingw-gcc стабильно медленнее во всех позициях (в т.ч. с -O3), так что удивляюсь тому чего его так любят, видимо из-за простоты установки и малого размера, лично я под Винду, всегда предпочту MSVS,чем альтернативные опенсорс компиллеры.

bonta ★★★★★
()
Последнее исправление: bonta (всего исправлений: 1)

Изучать Qt в поисках красивого и современного C++ точно не стоит, ибо Qt за всю свою жизнь (ровесник Linux) оброс горами самого разного Legacy-кода и дополнительными сущностями по типу MOC, которые расширяют синтаксис C++ добавляя в него несколько ключевых новых слов и систему сигналов и слотов.

А вот проект SerenityOS глянуть точно стоит. Там переимплементировали многие привычные вещи в самых разных OS на современном C++:

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Смешное. Во-первых, кросспатформенное говно на Qt никому особо не сдалось. Потому что и под мак и под винду люди используют тамошнее API и фреймворки. Когда делается что-то серьёзное по крайней мере. Во-вторых, экосистема даже одного WPF настолько обширная, и на нем столько всего написано, с 2005 года то, что всем кривым недофреймворкам с Линукса, вместе взятым, это и не снилось. Если мы добавим к этому Silverlight, ну и опять же Avalonia, то вообще ппц.

lovesan ★★★
()
Ответ на: комментарий от bonta

Кресты в mingw донельзя кривые. Нормальной работы с SEH/VEH нет. Интероперабельности ни с чем нет. COM нет. _vectorcall нет. SxS или подобные решения для стдлибы не используются. Манглинг свой, кривой. И только недавно научились в ucrt. Хедеры не полные. Переизобретение велосипедов повсюду, хотя надо было много где брать встроенную виндовую функциональность. Вобщем-то это такой странный продукт в себе, который бы я никому для прода не рекомендовал.

lovesan ★★★
()
Ответ на: комментарий от lovesan

Я к тому, что заявления наподобие «микрософт то,», «гугл сё» - это выдача авторитета за аргумент. А быть несогласным с целым гугл - это вероятно быть несогласным с 2-3 людьми.

rumgot ★★★★★
()
Ответ на: комментарий от hateyoufeel

наверное, я чего-то не понимаю, но в генте искаропки некоторые компоненты культей компилируются с флагом -DQT_NO_EXCEPTIONS, это разве не отключение исключений?

anonymous
()
Ответ на: комментарий от hateyoufeel

Для CL мне понравился гуй для GTK3/GTK4 по мотивам работы одного ЛОРовца из Казани - забыл точный ник.

А так, если бы не западные нарративщики недоделанные, то LispWorks CAPI был бы очень неплох. Да и вон в AllegroCL замутили какую-то интеграцию с браузером

anonymous
()
Ответ на: комментарий от lovesan

Гугловский маразм по отказу от исключений.


Это позиция школьника-олимпиадника, наивного олуха с нулевым опытом и без набитых шишек вообще.

Со временем понимаешь что это нисколько не маразм, и кресты вообще надо максимально ограничивать, если вообще их использовать приходится.

Код без исключений состоит преимущественно из лапши и бойлерплейта по обработке ошибок, в которых утонула основная логика программы. Программы на go и rust - тому доказательство. Мразотная херня.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)