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