【发布时间】:2019-12-17 03:17:14
【问题描述】:
我有以下功能:
class Foo;
template <typename T>
struct PyArray1D{
std::size_t size;
T *array;
};
extern "C" PyArray1D<Foo> SimulatePhotonEvents()
{
Foo * foo = new Foo();
return {1, foo}
}
然而,这并不能使用 VS2019 编译(但它使用 gcc)并带有警告
C 链接函数不能返回 C++ 类
但是,例如,当模板参数为双精度时,它确实有效......我可以返回一个“PyArray1D”,而 VS 不会抱怨。
所以我添加了一个新结构:
struct FooArray {
std::size_t size;
Foo *data;
};
然后从外部 C 函数返回这个。
extern "C" FooArray SimulatePhotonEvents()
{
Foo * foo = new Foo();
return {1, foo}
}
令我大吃一惊的是,它奏效了!我的问题是,为什么?
VS 还不够聪明,无法看到 FooArray get 是从模板函数中创建的吗?还有其他不那么老套的方法来解决这个问题吗?
【问题讨论】:
-
这都是关于Application Binary Inteface POD 类型的。如果您想使用 C 中的代码 - 您最好将
Foo *data;替换为void*或struct Foo *;
标签: c++ visual-studio-2019 extern-c