首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >proc宏可以确定调用编译的目标吗?

proc宏可以确定调用编译的目标吗?
EN

Stack Overflow用户
提问于 2019-09-30 23:57:01
回答 2查看 666关注 0票数 4

过程宏驻留在它们自己的板条箱中,这些板条箱是为开发机器编译的(以便在编译使用它们的板条箱时可以执行它们)。因此,过程宏箱中的任何条件编译指令都将基于它们的编译环境,而不是调用机箱的编译环境。

当然,这类宏可以扩展到包含条件编译指令的令牌,然后在调用机箱的编译上下文中对这些指令进行评估--但是,这并不总是可能的或可取的。

如果您希望扩展的令牌本身是调用机箱的编译环境的某些功能,则需要宏在其运行时(当然是调用机箱的编译时)确定该环境。显然,std::env模块是一个完美的用例.

但是,rustc不设置任何环境变量;而且Cargo只设置有限的少数。特别是,一些关键信息(如目标体系结构/操作系统等)根本不存在。

我理解调用机箱中的构建脚本可以为宏设置环境变量,然后再读取,但这给调用机箱作者带来了不令人满意的负担。

proc宏作者是否可以获得有关调用机箱编译环境的运行时信息(我最感兴趣的是目标体系结构和操作系统)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-01 07:30:44

通过递归到第二个proc宏调用中,第一个调用添加了具有文字布尔参数的#[cfg_attr]属性,然后可以在第二个调用中访问这些参数,这在某种程度上解决了这个问题:

代码语言:javascript
运行
复制
#[cfg_attr(all(target_os = "linux"), my_macro(linux = true ))]
#[cfg_attr(not(target_os = "linux"), my_macro(linux = false))]
// ...

一次黑客攻击,但成功了。

票数 4
EN

Stack Overflow用户

发布于 2022-03-18 14:11:10

我找到了另一个解决方案:

与其根据这样的标志生成代码,不如为所有操作系统生成代码,并在引用的代码中使用#[cfg(...)]

代码语言:javascript
运行
复制
quote! {
    #[cfg(linux)]
    {
        // linux specific stuff
    }

    #[cfg(not(linux))]
    {
        // not linux specific stuff
    }
}

这可能更干净。

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

https://stackoverflow.com/questions/58176547

复制
相关文章

相似问题

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