我正在用C ++实现回调,它将从普通C代码中调用。我的main()函数已经是C ++,但是C代码将负责创建线程,这些线程最终将调用我的回调。
现在我的回调看起来像
int handle_foo(void *userdata) {
try {
MyCPPClass *obj = static_cast<MyCPPClass *>(userdata);
obj->doStuff();
return 0; // no error
} catch(...) {
LogError("doStuff failed");
return -1; // error
}
}
可以,但是对我来说似乎很奇怪。此外,我失去了一些有用的功能,例如发现被抛出的内容的能力(没有catch
在我的每个回调中添加大量额外的语句)。
是try {} catch(...) {}
这里合理的,或者是有没有更好的方式来写我的C回调?
是的,您必须捕获异常并将其转换为有用的东西。通过C代码传播异常会导致未定义的行为。充其量您不能期望C代码保持一致的程序状态。
请参阅此答案作为简单示例。一个较难的示例是使用某些复杂的软件(例如SQLite)-C代码将获取一些互斥锁,并且不会释放该互斥锁,因为该异常只是“飞过”并且您的程序现在已被烘烤。
如果所有代码都是基于相同的C ++运行时构建的,那么这也有可能“起作用”。如果您碰巧在Visual C ++ 9中实现了回调,而在Visual C ++ 10中的其余代码或这些部分的其余部分是针对静态运行时库编译的,则您现在拥有两个截然不同的运行时,并且回调中的未处理异常会导致terminate()
被调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句