我已经看到一些锈蚀代码库使用了#[repr(C)]宏(这是它的名称吗?),但是,我找不到关于它的很多信息,但是它将内存中的类型布局设置为与‘C’的布局相同。
我想知道的是:这是一个预处理器指令,仅限于编译器,而不是语言本身(尽管没有任何其他编译器前端用于Rust),为什么Rust的内存布局与Cs的内存布局不同?(只是我从来没有用另一种语言这么做过)。
这里有一个很好的情况来演示我的意思:如果有人为Rust创建了另一个编译器,他们是否需要实现这个宏,或者是编译器特定的东西?
发布于 2021-04-23 22:22:00
这是什么?
它不是一个宏,而是一个属性。
这本书有一个关于宏是什么的好章,它提到了“类似属性的宏”:
宏一词指的是锈蚀中的一系列特性:带有macro_rules的声明性宏!以及三种程序宏:
类似属性的宏是可以像一样使用属性的宏。例如:
#[route(GET, "/")]
fn index() {}它看起来像repr属性,不是吗?
那么什么是属性呢?
幸运的是,Rust拥有大量的资源,比如按例生锈的其中包括。
属性是应用于某些模块、机箱或项的元数据。此元数据可用于/用于:
当你需要更深入地了解一些东西时,你通常会看到一些生锈参考。(属性章节)
对编译器作者来说:
如果您要编写一个生锈编译器,并且希望支持诸如标准库或其他板条箱之类的东西,那么您将100%地需要实现这些。因为库使用这些并且需要它们。
否则,我想您可能会想出编译器支持的锈蚀子集。但是大多数人都不会使用它..。
为什么铁锈不只是使用C布局?
例如,名称解释为什么铁锈需要能够重新排序结构的字段。为了节省空间和提高效率。除其他外,它与泛型和单体化有关。在repr(C)中,结构的字段必须与定义的顺序相同。
C表示是为双重目的设计的。一个目的是创建可与C语言互操作的类型。第二个目的是创建可以可靠地执行依赖于数据布局的操作的类型,例如将值重新解释为不同的类型。
https://stackoverflow.com/questions/67236193
复制相似问题