diff --git a/src/intro.md b/src/intro.md index 9fa7a18..e15fb6e 100644 --- a/src/intro.md +++ b/src/intro.md @@ -15,7 +15,7 @@ > > 如果大家对于翻译有更好的建议或者想法,欢迎直接 PR~ > -> 目前翻译基于 commit:336f75835a6c0514852cc65aba9a698b699b13c8,基于时间:2025/02/02。 +> 目前翻译基于 commit:8f5c7322b65d079aa5b242eb10d89a98e12471e1,基于时间:2025/02/19。 > > Q:为什么不基于之前已有的中文版进行改进? > diff --git a/src/other-reprs.md b/src/other-reprs.md index 904534b..382e60b 100644 --- a/src/other-reprs.md +++ b/src/other-reprs.md @@ -4,7 +4,7 @@ Rust 允许你指定不同于默认的数据布局策略,并为你提供了[ ## repr(C) -这是最重要的“repr”。它的意图相当简单:做 C 所做的事。字段的顺序、大小和对齐方式与你在 C 或 C++ 中期望的完全一样。任何你期望通过 FFI 边界的类型都应该有`repr(C)`,因为 C 是编程世界的语言框架。这对于合理地使用数据布局做更多的技巧也是必要的,比如将值重新解释为不同的类型。 +这是最重要的 `repr`。它的意图非常简单:按照 C 的方式处理数据。字段的顺序、大小和对齐方式完全符合你对 C 或 C++ 的预期。该类型在 `extern "C"` 函数调用边界中的传递方式,也正如 C 传递相应类型时的方式一样。任何你期望通过 FFI 边界传递的类型都应该使用 `repr(C)`,因为 C 是编程世界的通用语言。这样做对于安全地进行更复杂的数据布局技巧(例如将值重新解释为另一种类型)也是必要的。 我们强烈建议使用[rust-bindgen]和/或[cbindgen]来为你管理 FFI 的边界。Rust 团队与这些项目紧密合作,以确保它们能够稳健地工作,并与当前和未来关于类型布局和 `repr`s 的保证兼容。 @@ -36,7 +36,7 @@ Rust 允许你指定不同于默认的数据布局策略,并为你提供了[ 这些指定了使无字段枚举的大小和符号类型。如果判别符超过了它可以容纳的整数,就会产生一个编译时错误。你可以通过将溢出的元素明确设置为 0 来手动要求 Rust 允许这样做。 -术语“无字段枚举”仅意味着该枚举在其任何变体中都没有数据。没有`repr(u*)`或`repr(C)`的无字段枚举仍然是一个 Rust 本地类型,没有稳定的 ABI 表示。添加`repr`会使它在 ABI 上被视为与指定的整数类型大小完全相同。 +“无字段枚举”这一术语仅仅意味着该枚举的各个变体中不包含任何数据。没有使用 `repr` 的无字段枚举仍然是 Rust 的本地类型,其布局和表示并不稳定。添加 `repr(u*)` 或 `repr(i*)` 会使它在布局时完全被视作指定的整数类型(不过编译器仍会利用它对该类型中“无效”值的认识来优化枚举布局,比如当这个枚举被包裹在 `Option` 中时)。请注意,对于这些类型,函数调用的 ABI 通常仍未明确指定,除非在 `extern "C"` 调用中,它们与具有相同符号和大小的 C 枚举 ABI 兼容。 如果枚举有字段,其效果类似于`repr(C)`的效果,因为该类型有一个定义的布局。这使得将枚举传递给 C 代码或者访问该类型的原始表示并直接操作其标记和字段成为可能,详见[RFC][really-tagged]。