标识符前面的::(双冒号)是什么意思?

bor*_*ree 8 syntax rust

该行来自 Rust libc crate。这里双冒号有什么用?我认为它c_uint从板条箱根引入范围,但我找不到它在板条箱根中定义的位置。

pub type speed_t = ::c_uint;
Run Code Online (Sandbox Code Playgroud)

Mas*_*inn 9

https://doc.rust-lang.org/reference/paths.html#path-qualifiers

路径可以用各种前导限定符来表示,以改变其解析方式的含义。

::
Run Code Online (Sandbox Code Playgroud)

以 开头的路径::被认为是全局路径,其中路径的各段从 crate 根开始解析。路径中的每个标识符必须解析为一个项目。

所以你的想法是正确的,它是从板条箱根部解决的。

我找不到它在板条箱根中定义的位置。

Welllibc本身并没有在板条箱根处定义任何内容,而是板条箱根重新导出与编译目标匹配的子模块的内容。

因此,在 Unix 上, “crate root”包含fixed_width_intsunix子模块公开的任何内容。前者对你来说并不是真正有用,但后者......确实定义了一个c_uint符号

  • @bornfree 它可以在 `libc` 中工作,因为它是使用 2015 版 Rust 编译的,行为在 2018 版中发生了变化。 (3认同)

kmd*_*eko 6

该语法之所以有效,libc是因为它是使用 2015 版 Rust 编译的。路径参考包含注释:

版本差异:在 2015 版本中,crate 根包含各种不同的项目,包括外部 crate、默认 crate(例如 std 和 core)以及 crate 顶层的项目(包括 use 导入)。

从 2018 版开始,以 :: 开头的路径只能引用 crate。

2015 年,::c_uint会找到再导出类型,而 2018 年则不会。版本指南中更详细地描述了许多模块分辨率更改。


您可以在Playground上对其进行测试(您可以在“调试”和“稳定”旁边的高级选项菜单中更改版本)。