vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2024-10-29 02:53 pm

Toml на Си++

Понадобилось мне по работе в одном проекте задействовать конфигурационные файлы. До этого параметры приложения задавались обычными флагами в командной строке. Но когда параметров становится слишком много - проще записать их в скрипт конфигурации.

Конфигурационные скрипты бывают в разных видах: Json, Yaml, Ini, XML, Toml. Я выбрал Toml как самый простой для непосвящённых. Думал, быстренько схвачу первую попавшуюся библиотечку для Си++, и будет готово. Оказалось несколько труднее.

Я перебрал три реализации Toml для Си++. Со всеми возникли проблемы разной степени сложности.

1. TOML++, она же tomlplusplus. Самая продвинутая и распространённая библиотека. Присутствует в пакетах на Линуксе, Маке и везде. Якобы легко подключается через CMake - не верьте. Пробовал просто скопировать её исходник в свой проект, благо есть header-only версия. Но у меня ж все ворнинги включены (-Wall -Werror), в том числе -Wshadow. Плюс к тому обязательный cppcheck. А исходников в том файле toml.hpp аж 18000 строк. 475 килобайт кода на минуточку. Компилятор вкупе с cppcheck там столько всякого находят - мама не горюй. Ф топку.

2. Toml11. Тоже якобы неплох. Тоже громоздкий файл toml.hpp из примерно 18000 строк, уже 552 килобайта. И тоже лезет куча ворнингов от компилятора и ошибок от cppcheck. Нет сил с ними бороться.

3. Cpptoml. Файл cpptoml.h намного меньше, всего 3700 строк, порядка 90 килобайт. И фигни из него лезет немного: я за пятнадцать минут подчистил все хвосты. Вроде делает всё что требуется, вполне годный вариант.

Вывод: опенсорс это здорово, и иногда сильно помогает в работе. Но за качеством кода придётся следить самому.

[personal profile] vsold_1986 2024-10-30 12:16 am (UTC)(link)
Ещё в стареньком борланд билдере прекрасно работал. Сейчас переключился на Qt - вроде всё совместимо. Да и что там за "стандарт"? Проще пареной репы.
brmail: (Default)

[personal profile] brmail 2024-10-30 01:17 am (UTC)(link)
Если не стремиться получить вложенные секции, а ориентироваться на формат: секция, а внутри сколько угодно key-value пар. То какой еще стандарт нужен? Оно в таком виде со времен Доса, те более 40 лет.
А если нужно что то многоуровневое, то да ini слишком простой.