这是有问题的,因为当你编译这个库时,它会有一个未解析的到 discute() 的链接。相反,如果您需要在主模块中有库调用函数,最好在库中有指向存根函数的指针,然后在运行时通过从主模块到库的初始化调用来设置这些指针。我们在商业产品中大量使用这种方法来实现“回调”功能。这是我们代码中的一个示例:
在 library.h 中:
typedef bool (*pbWMC)(DCwfile *, unc);
// stub functions for uninitialized pointers
static bool StubbWMC(DCwfile *df, unc uch);
// variables set by Init()
static pbWMC WriteMacroChar;
在 library.cpp 中:
// callback functions
pbWMC DCmacr::WriteMacroChar = StubbWMC;
// stub functions for uninitialized function pointers
bool DCmacr::StubbWMC(DCwfile *df, unc uch)
{
return false;
}
// initializer called from main module
void DCmacr::InitMacroModule(DCwfile *df, pbWMC fwmc)
{
if (df)
DestFile = df;
if (fwmc)
WriteMacroChar = fwmc;
}
在主模块.cpp 中:
// call to initializer
DCmacr::InitMacroModule(wf, WriteMacroChar);
// function called by library
bool HTMwr::WriteMacroChar(DCwfile *df, unc uch)
{
HTMwfile *wf = (HTMwfile *) df;
if (uch == 183) { // bullet
wf->putSpec(uch);
return true;
}
return false;
}
这种设计允许我们为库的每次调用指定不同的回调函数,使代码真正模块化。我们使用 C++,但与 C 中的设计相同。HTH!