首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >repr(C)是预处理器指令吗?

repr(C)是预处理器指令吗?
EN

Stack Overflow用户
提问于 2021-04-23 20:00:59
回答 1查看 1.3K关注 0票数 1

我已经看到一些锈蚀代码库使用了#[repr(C)]宏(这是它的名称吗?),但是,我找不到关于它的很多信息,但是它将内存中的类型布局设置为与‘C’的布局相同。

我想知道的是:这是一个预处理器指令,仅限于编译器,而不是语言本身(尽管没有任何其他编译器前端用于Rust),为什么Rust的内存布局与Cs的内存布局不同?(只是我从来没有用另一种语言这么做过)。

这里有一个很好的情况来演示我的意思:如果有人为Rust创建了另一个编译器,他们是否需要实现这个宏,或者是编译器特定的东西?

EN

回答 1

Stack Overflow用户

发布于 2021-04-23 22:22:00

这是什么?

它不是一个宏,而是一个属性。

这本书有一个关于宏是什么的好章,它提到了“类似属性的宏”:

宏一词指的是锈蚀中的一系列特性:带有macro_rules的声明性宏!以及三种程序宏:

  • 自定义#派生宏,该宏指定与用于结构和枚举的派生属性一起添加的代码
  • 定义可用于任何项的自定义属性的类似属性的宏。
  • 类似函数的宏,它看起来像函数调用,但对指定为其参数的标记进行操作。

类似属性的宏是可以像一样使用属性的宏。例如:

代码语言:javascript
复制
#[route(GET, "/")]
fn index() {}

它看起来像repr属性,不是吗?

那么什么是属性呢?

幸运的是,Rust拥有大量的资源,比如按例生锈的其中包括

属性是应用于某些模块、机箱或项的元数据。此元数据可用于/用于:

  • 有条件编译代码
  • 设置机箱名称、版本和类型(二进制或库)
  • 禁用lints (警告)
  • 启用编译器特性(宏、glob导入等)
  • 链接到外国图书馆
  • 标记作为单元测试。
  • 标记将成为基准测试的一部分的函数

当你需要更深入地了解一些东西时,你通常会看到一些生锈参考。(属性章节)

对编译器作者来说:

如果您要编写一个生锈编译器,并且希望支持诸如标准库或其他板条箱之类的东西,那么您将100%地需要实现这些。因为库使用这些并且需要它们。

否则,我想您可能会想出编译器支持的锈蚀子集。但是大多数人都不会使用它..。

为什么铁锈不只是使用C布局?

例如,名称解释为什么铁锈需要能够重新排序结构的字段。为了节省空间和提高效率。除其他外,它与泛型和单体化有关。在repr(C)中,结构的字段必须与定义的顺序相同。

C表示是为双重目的设计的。一个目的是创建可与C语言互操作的类型。第二个目的是创建可以可靠地执行依赖于数据布局的操作的类型,例如将值重新解释为不同的类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67236193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档