双冒号(::)在标识符前面代表什么意思?

8

这行来自 Rust libc crate。为什么这里要用双冒号?我以为它是从 crate 根目录中引入 c_uint,但我在 crate 根目录中找不到它的定义。

pub type speed_t = ::c_uint;
2个回答

9

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

Paths can be denoted with various leading qualifiers to change the meaning of how it is resolved.

::

Paths starting with :: are considered to be global paths where the segments of the path start being resolved from the crate root. Each identifier in the path must resolve to an item.

所以你的想法是正确的,它从箱根解决。
我找不到它在箱根中的定义位置。
嗯,libc本身并没有在箱根中定义任何内容,相反,箱根重新导出与编译目标匹配的子模块的内容。
因此,在unix上,“crate root”包含由fixed_width_intsunix子模块公开的所有内容。前者对你来说并不真正有用,但后者......确实定义了符号

1
谢谢。我创建了一个示例程序来测试这个问题,通过重新导出子模块的内容,然后使用::来访问其中一个子模块中的符号。在编译时,我收到了一个“未在crate根目录中找到”的错误。但是当我使用crate::时,它可以正常编译。你有什么想法,我在重新导出时漏掉了什么吗?我在lib.rs中使用了“mod submodule;”,然后使用“pub use submodule::*”重新导出。 - bornfree
3
因为使用了 Rust 2015 Edition 进行编译,所以它在 libc 中可以正常工作。但在 2018 Edition 中,其行为发生了改变。请注意,本回答仅为翻译,不包含任何解释或额外内容。 - kmdreko

6

这种语法在libc中可行,因为它使用了Rust的2015版进行编译。与路径相关的参考资料包括以下说明:

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

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

在2015年,::c_uint将找到重新导出的类型,而在2018年则不会。有许多模块解析更改,在版本指南中有更详细的说明。


您可以在playground上测试它(您可以在Debug和Stable旁边的高级选项菜单中更改版本)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接