【发布时间】:2017-11-01 20:57:14
【问题描述】:
我有一些 C++ 代码返回 std::function。我想从一些 C 代码中调用它。这可能吗?例如,我有以下代码:
typedef std::function<int(int)> AdderFunction;
AdderFunction makeAdder(int amount) {
return [amount] (int n) {
return n + amount;
};
}
extern "C" {
AdderFunction makeCAdder(int amount) {
return makeAdder(amount);
}
}
clang++ -std=c++11 test.cpp 会导致以下警告:
'makeCAdder' has C-linkage specified, but returns user-defined type 'AdderFunction' (aka 'function<int (int)>') which is incompatible with C
我明白为什么会发生这种情况,但想知道是否有一种模式可以使它成为可能?
【问题讨论】:
-
为什么需要这个?它可能是XY Problem 的一个实例。
-
有几个选项。您可以返回
void*并在堆上分配std::function,还可以提供回调到C++、强制转换和对您想要的函数执行任何操作的函数。究竟如何将std::function转换为与 C 兼容的数据类型取决于您;您甚至可以将其放入原始字符数组(也许包装在结构中)。有很多选择 -
您可以通过返回原始函数指针(例如
int (*AdderFunction)(int)),但不能通过std::function。这基本上就是std::function::target所做的 -
@IharobAlAsimi 上下文是我正在尝试使用 Emscripten 为 Javascript 手动定义 C++ 代码的接口。 Embind 可以,但是会创建很多多余的代码并使用
eval来实现。