我想使用板条箱cpp创建一个宏,但是该板条箱存在宏扩展问题。
该包的工作原理是获取cpp!{ ... }
内联 C 代码的宏,将其内容编译为函数,并用结果函数替换宏调用。这是通过cpp_build::build("src/lib.rs")
调用build.rs
.
正如板条箱作者所述,cpp!
宏是在宏扩展发生之前编译的。这意味着它将尝试按原样解释宏的参数并在宏声明内部进行扩展。
build.rs
有没有办法在调用函数之前触发特定宏或文件内部的扩展cpp_build
?
小智 0
实现这一目标的方法是不使用宏(技术上)。syn
crate 有一个parse_file
可以从构建脚本调用的函数。然后您必须遍历语法树并找到实际的宏调用。syn
有一个visit
功能(请参阅模块文档),它将帮助您这样做。当您使用 定位宏调用时syn
,您可以直接运行宏。
然后,您需要提供您自己的宏版本(如果它们不是您的),这些宏通过删除proc_macro
属性Cargo.toml
并将这些版本添加到dev-dependencies
.
请注意,这仅在您没有询问宏中嵌套的宏时才起作用cpp!{}
- 如果您询问宏的内部结构,则宏的内部在语义上只能被视为令牌流(即使它是纯 Rust 代码),并且 syn 会给出你就是这样。syn::parse
如果内部代码是有效的 Rust,则需要手动重新处理它。如果是 C/C++,您必须供应商并扩展具有 Rust 宏支持的 C/C++ 解析器 - 但您可能可以采取更好/更简单的方法。