DISABLE_XXX vs XXX_DISABLE
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.06.25 21:26
Оценка:
Здравствуйте!

В свои некоторые плюсовые либы и проекты хочу присунуть возможность отключать некоторые фичи при помощи препроцессора.

Напрашивается имя DISABLE_XXX, где 'XXX' — отключаемая фича или даже библиотека какая-то, со всеми её фичами.

С другой стороны в либе 'XXX' могут быть свои опции, с префиксом XXX_ЧЕГО_ТО_ТАМ.

DISABLE_XXX — универсальный формат макроса для всех проектов, условно говоря, в конфиге проекта пишем DISABLE_AAA, DISABLE_BBB, DISABLE_CCC — и сразу понятно, что фичи/либы 'AAA', 'BBB', 'CCC' отключены, понятно, что отключено (в смысле, что выкл), и понятно, что отключено ( в смысле, какая фича/либа).

Для фич, которые по умолчанию выключены, можно использовать макро ENABLE_XXX. В идеале, если пользователь фичи/библиотеки не хочет полагаться на умолчательное поведение, либа/фича должна обрабатывать как DISABLE_XXX, так и ENABLE_XXX, и проверять DISABLE_XXX и ENABLE_XXX на конфликтность.

В либах же, кроме отключения фич, могут быть и настройки каких-то опций, поэтому было бы логично сделать настроечные макро с именами вида XXX_*, где XXX — имя либы, а '*' — имя фичи и что делаем с ней — включаем/выключаем/как-то настраиваем.

Отдельно в прикладном проекте тоже могут быть какие-то настройки, их тоже было бы удобно настраивать через 'DISABLE_ФИЧА_ПРОЕКТА'.

Мне такая семантика вполне нравится, но, может, у кого-то есть 'контра' против такого подхода?


Пример:

Есть либа marty::BigInt для произвольной длины целых. Она умеет конвертировать marty::BigInt в marty::Decimal (и поэтому сама подключает соответствующие хидеры), но поддержку marty::Decimal в marty::BigInt можно отключить, задав макро DISABLE_MARTY_DECIMAL. Правда, это отключит marty::Decimal и по всему проекту, но я не очень понимаю, зачем в разных частях одного проекта так делать. Опции DISABLE_XXX/ENABLE_XXX предполагаются глобальными для проекта (конкретной цели, не обязательно для всего "solution").

Замечу, что раз либа marty::BigInt зависит от marty::Decimal, то обработать DISABLE_MARTY_DECIMAL/ENABLE_MARTY_DECIMAL должна она, как и их непротиворечивость.

Другой вариант — marty::Decimal сама обрабатывает DISABLE_MARTY_DECIMAL/ENABLE_MARTY_DECIMAL, и может подсовывать пустоту, если задан макрос DISABLE_MARTY_DECIMAL. Это удобно тем, что не надо самому в использующей marty::Decimal либе что-то проверять, но тогда надо безусловно инклюдить "marty_decimal/marty_decimal.h", а значит, тащить marty::Decimal в зависимости проекта, а этого хотелось бы избежать.

Есть либа marty::Decimal, она сама по себе, и ничего в ней отключать нет необходимости (но какими-то фичами было бы неплохо порулить через MARTY_DECIMAL_*, например: MARTY_DECIMAL_DEFAULT_PRECISION — количество десятичных знаков после запятой, которое будет использовано при делении — в остальных случаях точность не нужна).

Есть либа marty::format для форматирования, она поддерживает по умолчанию как marty::BigInt, так и marty::Decimal.
Она проверяет DISABLE_MARTY_DECIMAL/ENABLE_MARTY_DECIMAL, DISABLE_MARTY_BIGINT/ENABLE_MARTY_BIGINT на непротиворечивость, подключает при необходимости нужные хидеры, и имплементирует или нет необходимые фичи.

Есть идеи?
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.