在我的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++ -only例程传递的),有没有办法根据C代码中的平台有条件地定义NUMEL?
最佳答案 npy_intp是typedef’ed
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
它可以在几乎所有平台上运行,但你可能会发现它不能移植到同样奇怪的角落案例系统.