过程宏驻留在它们自己的板条箱中,这些板条箱是为开发机器编译的(以便在编译使用它们的板条箱时可以执行它们)。因此,过程宏箱中的任何条件编译指令都将基于它们的编译环境,而不是调用机箱的编译环境。
当然,这类宏可以扩展到包含条件编译指令的令牌,然后在调用机箱的编译上下文中对这些指令进行评估--但是,这并不总是可能的或可取的。
如果您希望扩展的令牌本身是调用机箱的编译环境的某些功能,则需要宏在其运行时(当然是调用机箱的编译时)确定该环境。显然,std::env
模块是一个完美的用例.
但是,rustc不设置任何环境变量;而且Cargo只设置有限的少数。特别是,一些关键信息(如目标体系结构/操作系统等)根本不存在。
我理解调用机箱中的构建脚本可以为宏设置环境变量,然后再读取,但这给调用机箱作者带来了不令人满意的负担。
proc宏作者是否可以获得有关调用机箱编译环境的运行时信息(我最感兴趣的是目标体系结构和操作系统)?
发布于 2019-10-01 07:30:44
通过递归到第二个proc宏调用中,第一个调用添加了具有文字布尔参数的#[cfg_attr]
属性,然后可以在第二个调用中访问这些参数,这在某种程度上解决了这个问题:
#[cfg_attr(all(target_os = "linux"), my_macro(linux = true ))]
#[cfg_attr(not(target_os = "linux"), my_macro(linux = false))]
// ...
一次黑客攻击,但成功了。
发布于 2022-03-18 14:11:10
我找到了另一个解决方案:
与其根据这样的标志生成代码,不如为所有操作系统生成代码,并在引用的代码中使用#[cfg(...)]
。
quote! {
#[cfg(linux)]
{
// linux specific stuff
}
#[cfg(not(linux))]
{
// not linux specific stuff
}
}
这可能更干净。
https://stackoverflow.com/questions/58176547
复制相似问题