Не работает конфигурация с помощью макросов
Я делаю свою библиотеку и решил сделать конфигурацию с помощью макросов для неё. Вкратце о проблеме: Есть 2 класса. BRange и BIndex. Они будут использоваться параметром в будущих классах (для индексации). Так же я захотел возможность задавать индекс начиная с 1. То есть: 1 2 3 4 5, а не 0 1 2 3 4. Для этого я сделал 2 макроса которые бы взяли в себя 1 параметр(имя переменной) и приводили бы его в обычный индекс. То есть если была включена индексация с 1, то я просто бы отнимал единицу у числа и получал индекс. Проблема в этом: Почему-то даже после включения этой индексации макрос всегда становится таким же, как и в выключенном состоянии. Я уже просто не знаю что с этим делать. Изначально я пытался избавиться от того, чтобы у макроса который включает индексацию было какое-то значение. После я копировал имена макросов так-как мог ошибиться. Вставлял это в файл BIndex.h / BRange.h. (Изначально я использовал для этого другой файл - BConst.h). Кучу раз смотрел на отсутствие логических ошибок. Ничего не помогает. Скинул скрины и ссылку на архив с проектом.
И если что - это не баг IDE. При компиляции результаты так же неверные:
Ссылка на файлы проекта: https://drive.google.com/file/d/1mPZuVgL4hEhMc0_xSGsgIqvB_KJboq9I/view?usp=sharing
Ответы (2 шт):
Смотрите, когда вы компилируете main.cpp, у вас макрозначение BLIB_BINDEX_ADVANCED_INDEXING определено.
А когда вы компилируете bindex.cpp, например - то как по-вашему, оно определено или нет?... А у вас ведь этот код прилинковывается и вызывается из main.cpp...
Понимаете, в чем дело? В main.cpp нет никакой разницы, определено BLIB_BINDEX_ADVANCED_INDEXING или нет! Потому что оно играет роль в getindex(), которая вызывается из скомпилированного отдельно файла bindex.cpp, которому плевать, что вы там написали в main.cpp...
Есть несколько вариантов:
Задавать макросы флажками компилятора.
Сделать файл а-ля
blib_config.h. Туда свалить дефолтные значения макросов (как вариант - закоменченные), и предлагать пользователю менять их, если он хочет.Минус - ручное изменение хедера как-то не особо ложится на всякие пакетные менеджеры и т.п.
-
#if __has_include("blib_config.h") #include "blib_config.h" #endifИли, что примерно то же самое: имя файла засунуть в макрос (вместе с кавычками, иначе не проканает), и условием сделать
#ifdef, а не__has_include- тогда не нужен C++20.Тогда по дефолту конфига не будет, и юзер сможет его создать если захочет.
Последний вариант мне нравится больше всего.
Но сама идея - не нравится. Это все баловство. Заставляйте юзеров использовать единственно правильную систему индексации (надеюсь с 0, но это вы решаете).
Представьте: вашу библиотеку использует еще одна библиотека, а потом обе эти библиотеки использует какое-то приложение. Как будете справляться с разными настроками в производной библиотеке и приложении? Предлагать авторам производных библиотек везде втыкать этот макрос конвертации индексов? Фу. Гарантированно кто-нибдуь его забудет, а возможно вы сами.





