Не работает конфигурация с помощью макросов

Я делаю свою библиотеку и решил сделать конфигурацию с помощью макросов для неё. Вкратце о проблеме: Есть 2 класса. BRange и BIndex. Они будут использоваться параметром в будущих классах (для индексации). Так же я захотел возможность задавать индекс начиная с 1. То есть: 1 2 3 4 5, а не 0 1 2 3 4. Для этого я сделал 2 макроса которые бы взяли в себя 1 параметр(имя переменной) и приводили бы его в обычный индекс. То есть если была включена индексация с 1, то я просто бы отнимал единицу у числа и получал индекс. Проблема в этом: Почему-то даже после включения этой индексации макрос всегда становится таким же, как и в выключенном состоянии. Я уже просто не знаю что с этим делать. Изначально я пытался избавиться от того, чтобы у макроса который включает индексацию было какое-то значение. После я копировал имена макросов так-как мог ошибиться. Вставлял это в файл BIndex.h / BRange.h. (Изначально я использовал для этого другой файл - BConst.h). Кучу раз смотрел на отсутствие логических ошибок. Ничего не помогает. Скинул скрины и ссылку на архив с проектом.

На скрине видно как я объявляю макрос

Тут видно как объявляется макрос для индексации

Но макрос почему-то все равно false

И этот так-же

И если что - это не баг IDE. При компиляции результаты так же неверные:

файл main

Вывод в консоль

Ссылка на файлы проекта: https://drive.google.com/file/d/1mPZuVgL4hEhMc0_xSGsgIqvB_KJboq9I/view?usp=sharing


Ответы (2 шт):

Автор решения: Harry

Смотрите, когда вы компилируете main.cpp, у вас макрозначение BLIB_BINDEX_ADVANCED_INDEXING определено.

А когда вы компилируете bindex.cpp, например - то как по-вашему, оно определено или нет?... А у вас ведь этот код прилинковывается и вызывается из main.cpp...

Понимаете, в чем дело? В main.cpp нет никакой разницы, определено BLIB_BINDEX_ADVANCED_INDEXING или нет! Потому что оно играет роль в getindex(), которая вызывается из скомпилированного отдельно файла bindex.cpp, которому плевать, что вы там написали в main.cpp...

→ Ссылка
Автор решения: HolyBlackCat

Есть несколько вариантов:

  1. Задавать макросы флажками компилятора.

  2. Сделать файл а-ля blib_config.h. Туда свалить дефолтные значения макросов (как вариант - закоменченные), и предлагать пользователю менять их, если он хочет.

    Минус - ручное изменение хедера как-то не особо ложится на всякие пакетные менеджеры и т.п.

  3. #if __has_include("blib_config.h")
    #include "blib_config.h"
    #endif
    

    Или, что примерно то же самое: имя файла засунуть в макрос (вместе с кавычками, иначе не проканает), и условием сделать #ifdef, а не __has_include - тогда не нужен C++20.

    Тогда по дефолту конфига не будет, и юзер сможет его создать если захочет.

Последний вариант мне нравится больше всего.

Но сама идея - не нравится. Это все баловство. Заставляйте юзеров использовать единственно правильную систему индексации (надеюсь с 0, но это вы решаете).

Представьте: вашу библиотеку использует еще одна библиотека, а потом обе эти библиотеки использует какое-то приложение. Как будете справляться с разными настроками в производной библиотеке и приложении? Предлагать авторам производных библиотек везде втыкать этот макрос конвертации индексов? Фу. Гарантированно кто-нибдуь его забудет, а возможно вы сами.

→ Ссылка