Си++: форматированный вывод (продолжение)

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

Мои приключения c форматированным выводом в Си++ до сих пор не закончились, оказалось, что последний вариант обёртки над std::snprintf в одном из компиляторов не собирается с одним из видов аргументов, пришлось его обернуть в std::cref.

Умные люди в комментариях советуют перейти на внешнюю библиотеку fmt и я уже сделал подход к снаряду, но под mingw у меня сборка пока не заработала. Завтра попытаюсь ещё раз — хочу подключить библиотеку подмодулем к своему репозиторию встроить компиляцию в процесс сборки своего проекта. Мне кажется, что я делаю всё правильно, а вот mingw так не кажется, попытаюсь завтра побороть.

Читайте также

ChatGPT-4 vs. Chat X-Colleagues
Раз у меня нарисовалась задача, где я довольно мелко плаваю, было бы логично протестировать на нём возможности ChatGPT-4, тем более часто говорят о том, что он насколько хорош, что программисты уже не нужны. Я сегодня уже рассказывал о своём опыте в Си и Си++.
2023
«Гопник-2»: убрал printf
Закончил убирать функцию printf, сегодня вколотил последний гвоздь в крышку её гроба. Я почему-то наивно полагал, что на этом моя работа по избавлению от char * будет окончена, но не учёл, что в коде довольно много (больше 150) других мест, где ещё используется этот тип.
2023
Си++: форматированный вывод
Си++, похоже, язык для воспитания героев — создаём трудности на ровном месте и начинаем их преодолевать. В моём случае началось всё с разумной, как мне до сих пор кажется, идеи — заменить сишные безобразные строки char * на прекрасный класс std::string из Си++.
2023

Комментарии 4

Сергей Чебан № 1
Не спеши.
1. Проблема в том, что ты пока недостаточно хорошо знаешь язык. Ты пытаешься делать достаточно сложные вещи, они закономерно не работают, и виноваты в этом не компиляторы.
2. Одна из особенностей экосистемы C++ заключается в том, что она не предоставляет готовые решения для кучи актуальных программистских задач. Поставив компилятор, ты не найдёшь в комплекте ни средств для работы с HTTP, ни криптографии, ни логгинга. Всё это есть, но процесс интеграции сторонних библиотек в свой проект настолько нетривиален, что иногда проще плюнуть и реализовать нужное самостоятельно.
3. Экосистемы Windows и Unix сильно отличаются друг от друга. Ты замахнулся сразу на обе, не зная толком ни одной, ни другой. Конечно, тебе тяжело.

Почему оно так? Да потому что корни C++ растут из 1970 года и ещё более ранних времён. Многие подходы, принятые в те времена, сейчас устарели, но уйти от них не получается, потому что на них держится пятидесятилетний хвост legacy. Ты-то в своём проекте можешь сделать всё по-новому, но кто будет дорабатывать написанную в 1995 году библиотеку zlib? Ото ж.

Что касается библиотеки fmt, есть смысл начать с чтения документации: https://fmt.dev/latest/usage.html. Там предложены разные варианты установки этой библиотеки (а в процессе чтения выяснится, что C++ существует не сам по себе, а в экосистеме, в которую, кроме него, входят cmake и пр.).
Евгений Степанищев автор № 2
Мне тут в личке грозятся сделать пулл-реквест и притащить //conan//, //cmake// и //fmt//. Что же, посмотрю )

В моей попытке перехода на //fmt// я из //Makefile// вызывал //cmake//, в документации такого способа нет, пришлось самому сколхозить, но путь с переходом на //cmake// мне нравится больше, конечно, просто всё сразу я не осилю, хотел есть слона по частям.
Сергей Чебан № 3
Обычно всё же не из make вызывают cmake, а наоборот. Т.е. workflow примерно такой:
mkdir build
cd build
cmake .. # создаёт makefile или его эквивалент в зависимости от платформы и опций
cmake --build . # вот это можно заменить на make или msbuild

А если у тебя уже есть makefile, к которому ты привязан, то вся история с cmake теряет смысл: его задача — обеспечить сборку проекта там, где нет make, а есть вместо него что-то другое.
Евгений Степанищев автор № 4

Мне проект достался с Makefile, да. Я его только причесал, а то там никакой автоматизации не было — файлы просто перечислялись внутри. fmt идёт с cmake, чтобы компилировать одной командой, я вызываю cmake из Makefile.

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