Пытаюсь сделать систему для выполнения действий до запуска функции main(). Нужно для регистрации метаинформации о классах. Решил делать через глобальные переменные в cpp-файлах:
// Работает за счёт выполнения кода конструктора при инициализации глобальной переменной. До main
class BeforeMainHelper { public: BeforeMainHelper() { /* Before main start actions */ } } __helper__;
Проблема возникает в случаи, если нужна подобная регистрация больше чем один раз в рамках одного cpp-файла. Проблема по очевидным причинам. Конфликт имён.
Нужен механизм генерации уникальных имён для макросов. В начале я хотел использовать конкатенированные значения встроенных макросов __line__ и __file__ (комбинация, уникально задающая строку в рамках всего проекта). Но __file__ представляет из себя строковую переменную, которую нельзя конкатенировать в качестве части имени переменной. Чтобы заменить бэкслеши в пути файла на нижние подчёркивания у меня недостаточно чёрной компайл-тайм магии - не знаю как такое сделать.
Я прочитал про другую макросную "переменную" - __counter__. Не смотря на то, что она не входит в стандарт, решил попробовать с ней что-нибудь придумать. Столкнулся с другой проблемой - мне же нужен дважды один и тот же идентификатор (в начале для типа, потом для конструктора). Если использовать __counter__, он инкрементиться после первого использования, и имена у класса и конструктора становятся разными.
Таким образом я попал в тупик, из которого не знаю как выйти. Сейчас, во время тестирования, всё работает на конкатенации с номером строки. Но так оставлять это дело нельзя - могут быть очень неприятные, плохо отлавливаемые баги.
Помогите, пожалуйста, если кто имел дела с подобными штуками!