【问题标题】:Convert simple C #define's into Rust constants将简单的 C #define 转换为 Rust 常量
【发布时间】:2016-05-30 06:51:35
【问题描述】:

我有一个专有库,内容很长,标题为 30KLoC。我想为 Rust 生成绑定。我几乎成功地使用了bindgen crate。除了bindgen 不能将宏常量转换为普通常量。因为这些常量是以一种模糊的方式定义的,比如

#define CONSTANT ((const_type)SOME_OTHER_CONSTANT)

那么,有没有办法将这样的半常量转换为普通的 Rust 常量:

const Type name = value;

更新

显然,crate bindgen 使用 clang 作为其后端。如果向解析器提供了正确的标志,clang 能够处理宏定义和其他类似的东西。那么,任何人都可以提供关于使用libclang API 处理宏定义的好教程吗?

【问题讨论】:

  • 不幸的是,在 Stack-Overflow 上询问工具/书籍/等是题外话。一个简单的技巧是将问题改写为只问“如何”而不是指定您正在寻找工具......毕竟可能有一种无需工具的方式。
  • 在 C 中,一般答案是“否”。这是因为文字被视为常量表达式,而带有const 限定符的变量则不是。在 C 中有些上下文需要常量表达式(例如,静态变量的初始化程序)。所以这个改变可能会破坏程序。

标签: c rust c-preprocessor


【解决方案1】:

通过gcc -E(即预处理器)运行标头将删除#defines。不过,它可能会删除比您想要的更多的内容。

如果您想有选择地进行预处理,曾经有一个名为scpp 的实用程序可以做到这一点。除了一些要下载的 tar 文件外,我无法立即找到对它的引用,但你可能会更幸运。

【讨论】:

  • 这就是我所反对的。通过#define 定义了数百个常量。我需要保护它们。
  • @Target-san 与 -dM-dD 您可以保留宏(区别是“仅”与“两者”)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多