gpt4 book ai didi

c++ - 如何在 C 中公开 C++ 函数指针?

转载 作者:行者123 更新时间:2023-12-01 14:03:31 24 4
gpt4 key购买 nike

我在 C++ 中定义了两种类型的函数指针,如下所示:

typedef void(*CallbackFn)(bool, std::string, py::array_t<uint8_t>&);
typedef std::function<void(std::string)> LogFunction;
Class Core{
...
void myfunc1(LogFunction lg1, CallbackFn callback, int x, std::string y);
};

我希望能够在 C 中公开它们,但我似乎找不到这样做的方法。我的第一次尝试是将这些转换为 void*然后将它们重铸回它们的实际类型。但这似乎是个坏主意。所以我对如何进行这种转换一无所知。
此外,我需要提出的解决方案至少应该可以使用 C++11。

更新:

非常感谢您的回答。但是,我需要添加更多解释作为我所追求的。我知道 extern "C"事实上 C++函数已经在我的 DLL 中使用它公开了.但是,我遇到的问题是通过 函数指针在 C 和 C++ 之间来回切换。
一种方法是以 C 可以直接使用的方式定义函数指针。我需要更改例如:

typedef void(*CallbackFn)(bool, std::string, py::array_t<uint8_t>&);
typedef std::function<void(std::string)> LogFunction;

到它的 C 兼容之一:
typedef void(*CCallbackFn)(bool, char*, int, unsigned char, int length);
typedef void(*CLogFunction)(char* string, int length);

并改用这些。但是,这样做的缺点是,C++ 客户端也使用 DLL,这会妨碍将 C++ 的所有内容更改为与 C 兼容,这样做会失去 C++ 的优势。
相反,我想出了第二种方法。 C++ 保持不变,但对于 C 链接和通过 C API 与其他语言交互,我自己进行转换。
那就是他们使用 C 风格,然后我在实现部分将其转换回 C++。为了进一步简化这一点,我也在 C++ 部分设计了一些默认值。意思是,假设缺少一个更好的例子,实例需要一个回调函数来记录发生的任何事情。我定义了一个回调函数,以防它不是由用户提供的,并为 C API 创建了两个函数,具体类似于以下内容:

//in core.cpp for example
include "Core.h"
...

extern "C"
{
Core * core;
...

Core_API void* get_default_log_callback()
{
return (void*) core->SomeDefaultCallback();
}

Core_API void* set_log_callback(void* fn)
{
// convert/cast that to the c++ callback type
// CallbackFn,
core->SetCallback(fn_converted);
}


例如,客户端可以使用 get_default_log_callback 并使用其返回 set_log_call_back .
基本上这里的想法是能够使用 C++ 已经定义的 Assets 。
我被困在这个转换过程中,如何将这种回调指针转换为 C 兼容类型(就像我展示的那样,例如,将指针强制转换为 void* 并编写一个接受 void* 的 C 包装器真的很容易然后将其重新转换为正确的类型。

我也想知道这种情况,以及这是一种好的做法还是不好的做法。

问题二:

另外我想知道是否可以从 CCallbackFn 进行转换。和 CallbackFn ?
假设我在 CCalbackFn 中有一个函数(例如上面的 C 函数) form ,但我想最终将它放在 CallbackFn 中form(更改它并调用接受 CallbackFn 的底层 C++) ?这可能吗 ?

最佳答案

C 不做/不能处理 C++ 名称修改(也不是与 C 类型不同的 C++ 类型)。你不能在任何暴露于 C 的东西中使用非 POD 类型(以及涉及在 C 中不能使用的类型的普通函数指针)。你需要使用 extern "C"对于暴露的东西,禁用名称修改(或者更确切地说,使用您当前平台 C 编译器使用的任何命名约定/修改)。

简而言之:使用 extern "C"对于必须可从 C 调用的任何内容,并确保以这种方式公开的任何内容仅使用您可以在 C 中编写/使用的类型。

关于c++ - 如何在 C 中公开 C++ 函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61102468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com