Skip to content

Commit

Permalink
跟随上游 PR #461 修改
Browse files Browse the repository at this point in the history
  • Loading branch information
PureWhiteWu committed Feb 19, 2025
1 parent 6c9db5e commit 16800e5
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
>
> 如果大家对于翻译有更好的建议或者想法,欢迎直接 PR~
>
> 目前翻译基于 commit:336f75835a6c0514852cc65aba9a698b699b13c8,基于时间:2025/02/02
> 目前翻译基于 commit:8f5c7322b65d079aa5b242eb10d89a98e12471e1,基于时间:2025/02/19
>
> Q:为什么不基于之前已有的中文版进行改进?
>
Expand Down
4 changes: 2 additions & 2 deletions src/other-reprs.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 的保证兼容。

Expand Down Expand Up @@ -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]

Expand Down

0 comments on commit 16800e5

Please sign in to comment.