我使用静态全局变量构造函数来方便地注册函数,这个想法是这样的:
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)
问题是,如果我在静态库中使用它,有时链接器会检测到编译单元没有被使用,它会丢弃整个东西。所以没有构造全局变量,也没有注册函数……
我的问题是:我能做些什么来解决这个问题?在初始化期间在每个编译单元中调用虚拟函数似乎会触发全局变量的构造,但这感觉不是很安全。还有什么建议吗?