rust - FFI 原始类型大小
问题描述
假设,我有一个 C/C++ 标头,其类型定义如下:
typedef int WORD;
和这样的功能:
WORD test(WORD input);
现在,据我了解,C/C++ 中的 int 可以具有不同的大小,具体取决于平台。如果我现在将 Rust 代码链接到具有所述函数的 dll,我的 FFI 会因为不同大小的原始类型而中断吗?我该如何防范呢?
解决方案
int
在 C 中保证至少有 2 个字节的大小。确切的大小由实现定义。
C ABI 在一个操作系统和架构上通常是稳定的。
Rust 没有可以在不同架构之间随大小而变化的整数类型(除了isize
和usize
)。这是设计选择,但您可以尝试使用保证与目标系统 C ABI 对应的可变大小类型。
use libc::c_int;
libc crate 中的C 类型正是您所需要的。
但我建议不要依赖可以具有可变大小的类型,而是使用固定宽度的整数类型,例如C 和Rust 中的int32_t 。i32
考虑到不同大小的原始类型正确编码有时可能具有挑战性。
编辑:字节是指恰好有 8 位的字节,而不是 C 标准定义的字节。
推荐阅读
- javascript - 如何创建一个将随机字符串(来自数组)分配给某个变量的函数?
- c# - 如何在运行时统一旋转游戏对象
- mysql - MySQL:尝试运行 CUBE 查询 -> sql 语法错误 | 限制 0,25
- python - 使用 Apache Nifi 或 Python 脚本迭代 Json 数组
- javascript - 如何使用 RegEx 从 RSS (XML) 提要中去除 CDATA 标记?
- python - 如何在Django中压缩通过ckeditor上传的图像?
- javascript - 将集合中的项目发布到 Spring Data Rest api
- git - 无法以所有者身份推送到组织存储库
- laravel - 基于输入值的 Laravel 搜索系统
- javascript - 从 OBJ-1 读取嵌套的 JSON 节点/键并从 OBJ-2 中找到这些键值,然后在 Javascript 中更新 OBJ-1.JSON