long int* 到 np_intp* 平台相关的转换

long int* to np_intp* platform dependent conversion

在我的 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 例程传递),是否有条件地定义 NUMEL 取决于在 C++ 代码的平台上?

npy_intptypedef 编辑 here 为:

typedef Py_intptr_t npy_intp;

Py_intptr_tpyport.h. It is highly system dependent, see that source for details, but for most cases, unless you are dealing with Microsoft's Visual C being C89, you have stdint.h and can simply include it and use intptr_t as your type. In C++ this comes as std::ptrdiff_t, take a look also at its unsigned counterpart, std::size_t的Python C源代码中定义。

作为最后的手段,您总是可以复制 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

它几乎可以在所有平台上运行,尽管您可能会发现它不能移植到同一个奇怪的角落案例系统。