我正在开发一个C ++库,该库将作为插件在C ++和C程序中动态加载(dlopen,dlsym ...)。

C ++程序将使用创建者的破坏器函数从库中分别调用构造函数和析构函数。像这样:

void *creator(void *instance) {
    return new MyClass();
}

void destroyer(void *instance) {
    MyClass *_instance = static_cast<MyClass*>(instance);
    delete _instance;
}


问题是:不是那种类型的安全。
在这里可以安全输入吗? (static_castdynamic_castreinterpret_cast ...)

这很重要,因为我打算为每个MyClass方法创建一个C包装器。这样一来,我就可以将该库加载到C程序中(类似于DBus C移植,可以与C风格或C ++风格一起使用)。
所以我会做这样的事情:

int MyClassAddInts(void *instance, int a, int b) {
    MyClass *_instance = static_cast<MyClass*>(instance);
    return _instance->addInts(a, b);
}


请记住,这只是一个虚拟的例子。

非常感谢。

最佳答案

并不是的。通过C接口的全部要点是,剥离了对任何C ++ ABI的所有依赖关系,因此您无法以“自然”的方式保留类型信息。

如果这确实对您很重要,则可以构建一些复杂的元数据基础结构以进行一些运行时测试,但是您当然不会从中获得编译时类型安全性。

10-07 19:17
查看更多