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

在我的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

它可以在几乎所有平台上运行,但你可能会发现它不能移植到同样奇怪的角落案例系统.

点赞