首页 > 解决方案 > FFI 原始类型大小

问题描述

假设,我有一个 C/C++ 标头,其类型定义如下:

typedef int WORD;

和这样的功能:

WORD test(WORD input);

现在,据我了解,C/C++ 中的 int 可以具有不同的大小,具体取决于平台。如果我现在将 Rust 代码链接到具有所述函数的 dll,我的 FFI 会因为不同大小的原始类型而中断吗?我该如何防范呢?

标签: rustffiprimitive-types

解决方案


int在 C 中保证至少有 2 个字节的大小。确切的大小由实现定义。

C ABI 在一个操作系统和架构上通常是稳定的。

Rust 没有可以在不同架构之间随大小而变化的整数类型(除了isizeusize)。这是设计选择,但您可以尝试使用保证与目标系统 C ABI 对应的可变大小类型。

use libc::c_int;

libc crate 中的C 类型正是您所需要的。

但我建议不要依赖可以具有可变大小的类型,而是使用固定宽度的整数类型,例如C 和Rust 中的int32_t 。i32考虑到不同大小的原始类型正确编码有时可能具有挑战性。

编辑:字节是指恰好有 8 位的字节,而不是 C 标准定义的字节。


推荐阅读