gpt4 book ai didi

rust - 具有任意常量表达式的 cfg 属性

转载 作者:行者123 更新时间:2023-12-05 04:33:32 26 4
gpt4 key购买 nike

我有以下常量:

const IS_WSL: bool = is_wsl!();

我希望能够将它与 cfg 属性一起使用来执行条件编译。像这样的东西:

#[cfg(const = "IS_WSL")]  // what goes here?
const DOWNLOLADS: &'static str = "/mnt/c/Users/foo/Downloads";

#[cfg(not(const = "IS_WSL"))]
const DOWNLOADS: &'static str = "/home/foo/Downloads";

显然这种语法不起作用,但是有什么方法可以实现我所描述的吗?

我知道自定义 rustc 标志,但我想避免这样做,因为有相当多的逻辑我不想尝试用 bash 编写

最佳答案

答案是否定的。您必须使用构建脚本之类的东西来实现这一点。

它无法工作,因为 cfg - 扩展发生在编译器中比常量评估更早的阶段。

cfg 扩展与宏扩展同时工作。两者都会影响名称解析(宏可以创建新名称,其他宏甚至同一个宏以后可以引用)这迫使我们使用定点算法(解析名称,扩展宏,解析名称,扩展宏。 .. 直到无法解析更多名称,即达到固定点)。 const 评估发生在类型检查之后,有时甚至在代码生成期间(使用 generic_const_exprs)。如果它会影响宏扩展,我们将有一个巨大的定点循环解析名称 - 扩展宏 - 解析名称 - 扩展宏......直到达到一个固定点,然后降低到 HIR - 类型检查 - 评估常量(或甚至低于 MIR - 单态化和评估常量) - 并返回到名称解析。除了大大降低编译器速度外,它还会使编译器变得更加复杂,这并不是 rustc 团队真正想要的。

关于rust - 具有任意常量表达式的 cfg 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71368383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com