长 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++ 例程传递的),有没有办法根据C++代码中的平台有条件地定义NUMEL
?
npy_intp
在这里typedef
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
它几乎适用于所有平台,尽管您可能会发现它不能移植到同一个奇怪的角落案例系统。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 重载运算符new[]的行为取决于析构函数
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 新的放置取决于 iostream
- Writefile() 无法写入数据,具体取决于数据的长度
- 如何基于平台在制作文件中制作if语句?
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 在 Linux 平台的 C++ 中动态加载 DLL
- SFINAE是否取决于类型推断?
- 将强制转换简化为取决于参数的类型
- 修复"-Wunused-parameter"取决于预处理器条件的警告
- 无法使用 aarch64-unknown-nto-qnx7.0.0-g++-5.4.0 编译器交叉编译 QNX 平台的
- 如何判断类型双关语在我的平台上是否可以?
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?
- 操作系统平台支持宏和提升库
- 奇怪的Arduino C++编译错误取决于文件位置
- CMake 条件库链接取决于平台
- 长 int* 到 np_intp* 取决于平台的转换