在我的 64 位办公桌面上,编译正常:
#include <Python.h>
#include <numpy/arrayobject.h>
...
Py_Initialize();
import_array();
// Build array object
long int NUMEL=3;
PyObject *out_array = PyArray_SimpleNew(1, &NUMEL, NPY_DOUBLE);
相反,在我的 32 位笔记本电脑上,这无法产生错误:
error: invalid conversion from ‘long int*’ to ‘npy_intp* {aka int*}’ [-fpermissive]
PyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)
或者,如果我改为声明 int NUMEL=3
,代码将在 32 位机器上编译,但不能在 64 位机器上编译。我怀疑 npy_intp
是平台相关的。由于我无法定义 npy_intp
类型的 NUMEL
(实际上它是由其他仅 C/C++ 例程传递的),是否有条件地定义 NUMEL
取决于 C++ 代码中的平台?
最佳答案
npy_intp
是 typedef
的 here成为:
typedef Py_intptr_t npy_intp;
并且 Py_intptr_t
在 pyport.h
中的 Python C 源代码中定义。 .它高度依赖于系统,请参阅该源以获取详细信息,但在大多数情况下,除非您处理 Microsoft 的 Visual C 是 C89,否则您有 stdint.h
并且可以简单地包含它并使用 intptr_t
作为你的类型。在 C++ 中,这是 std::ptrdiff_t
。 , 也看看它未签名的拷贝,std::size_t
.
作为最后的手段,您总是可以复制 Python 所做的事情,例如:
#if sizeof(void *) <= sizeof(int)
typedef int my_type;
#elif sizeof(void *) <= sizeof(long)
typedef long my_type;
#else
typedef long long my_type;
#endif
它几乎可以在所有平台上运行,尽管您可能会发现它不能移植到同一个奇怪的角落案例系统。
关于c++ - long int* 到 np_intp* 平台相关转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37693169/