C++编译纯C风格结构体与C库回调函数传参兼容性问题咨询
问题2:C++函数指针传递给C库回调的兼容性
只要满足以下条件,就不会出现运行时错误:
- 你的C++回调函数是全局函数,或者类的静态成员函数(不能是类的非静态成员函数,非静态成员函数有隐含的this指针,参数列表和C的要求不匹配)
- 回调函数的调用约定和C库要求的调用约定一致:默认情况下VC的C/C全局函数都使用
__cdecl调用约定,和sqlite3的要求匹配,不需要额外调整 - 回调函数内部不要抛出C异常:C语言代码无法处理C异常,异常透出到C库会直接触发程序崩溃,需要在回调函数内部把所有C++异常捕获处理完毕再返回
名称修饰规则只会影响编译期的符号链接解析,函数指针存储的是函数的内存地址,只要签名、调用约定匹配,C和C的函数指针完全兼容。如果想彻底规避潜在问题,可以给C侧的回调函数添加extern "C"修饰:
extern "C" int Callback_GetAllPerson(void* NotUsed, int argc, char** argv, char** azColName);
加了修饰后,函数的调用约定、名称规则完全和C一致,兼容性更有保障。
内容的提问来源于stack exchange,提问作者Vishal Chavda
相关产品推荐
相关产品推荐

