Я использую статические глобальные конструкторы переменных как трюк, чтобы удобно регистрировать функции, идея идет примерно так:
typedef int (*FuncPtr)(int);
struct RegHelper
{
RegHelper(const char * Name, FuncPtr Func)
{
Register(Name, Func);
}
}
#define REGISTER(func) RegHelper gRegHelper_ ## func (#func, func);
Теперь я могу зарегистрировать функции таким образом (я использую его для реализации какого-то отражения):
int Foo(int a)
{
return a * 123;
}
REGISTER(Foo)
int Bar(int a)
{
return a * 456;
}
REGISTER(Bar)
Проблема заключается в том, что если я использую это в статической библиотеке, иногда компоновщик обнаруживает, что блок компиляции не используется, и он упускает все это. Таким образом, глобальные переменные не создаются, и функции не регистрируются...
Мой вопрос: что я могу сделать, чтобы обойти это? Вызов фиктивных функций в каждом модуле компиляции во время инициализации, похоже, вызывает построение глобальных переменных, но это не очень безопасно. Любое другое предложение?