我正在尝试在 C++ 应用程序中使用 C 库,并在以下情况下发现了自己(我知道我的 C,但我对 C++ 还很陌生)。在 C 端,我有一组函数,它们以函数指针作为参数。在 C++ 方面,我有一个带有仿函数的对象,它与 C 函数所需的函数指针具有相同的签名。有没有办法使用 C++ 仿函数作为函数指针传递给 C 函数?
原文由 dagw 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
您不能直接将指向 C++ 仿函数对象的指针作为指向 C 代码(甚至 C++ 代码)的函数指针传递。
此外,要将回调可移植地传递给 C 代码,它至少需要声明为
extern "C"
非成员函数。至少,因为某些 API 需要特定的函数调用约定,因此需要额外的声明修饰符。在许多环境中,C 和 C++ 具有相同的调用约定,并且仅在名称修饰上有所不同,因此任何全局函数或静态成员都可以使用。但是您仍然需要将调用
operator()
包装在一个普通函数中。你可以编写一个普通的外部“C”函数来创建仿函数并执行它的operator()。
并且 C 回调函数采用某种用户状态参数(通常为 void *):
您可以编写一个普通的 extern “C” 函数,将其状态参数转换为您的仿函数对象:
并像这样使用它: