【问题标题】:What is the built-in `#[main]` attribute?什么是内置的 `#[main]` 属性?
【发布时间】:2022-02-16 07:57:02
【问题描述】:

我一直在我的一个程序中使用#[tokio::main] 宏。导入main后不合格使用后,遇到意外错误。

use tokio::main;

#[main]
async fn main() {}
error[E0659]: `main` is ambiguous
 --> src/main.rs:3:3
  |
3 | #[main]
  |   ^^^^ ambiguous name
  |
  = note: ambiguous because of a name conflict with a builtin attribute
  = note: `main` could refer to a built-in attribute

我一直在搜索文档,但在任何地方都找不到这个内置的 #[main] 属性。 The Rust Reference contains an index of built-in attributes。该索引不包括#[main],但确实包括an attribute named #[no_main]

我搜索了rustlang/rust 存储库,找到了some code that seems related,但它似乎使用了一对名为#[start]#[rustc_main] 的宏,而没有提及#[main] 本身。 (这两个宏似乎都不能在 stable 上使用,#[start] 发出一个不稳定的错误,#[rustc_main] 发出一个错误,它仅供编译器内部使用。)

从名称中我猜想它是为了将不同的函数标记为入口点而不是 main,但它似乎也没有这样做:

#[main]
fn something_else() {
    println!("this does not run");
}

fn main() {
    println!("this runs");
}

Rust Analyzer 提供的不多:


除了与我的导入冲突之外,内置的 #[main] 属性还有什么作用? ????

【问题讨论】:

    标签: rust main entry-point rust-macros


    【解决方案1】:

    #[main] 是 1.53.0 中一个旧的、不稳定的属性 that was mostly removed from the language。但是,删除遗漏了一行,结果你看到:属性没有效果,但它可以在稳定的 Rust 上使用而没有错误,并且与名为 main 的导入属性冲突。这是a bug, not intended behaviour。从nightly-2022-02-101.59.0-beta.8 开始,它是has been fixed。您的 use tokio::main;#[main] 示例现在可以正常运行。

    在它被删除之前,不稳定的#[main] 被用来指定程序的入口点。 Alex Crichton 在a 2016 comment on GitHub 中描述了它的行为和相关属性:

    啊,是的,我们有三个入口点。我..认为这就是他们的工作方式:

    • 首先,#[start]int argcchar **argv 的接收者。这实际上是符号 main(或编译器中生成的符号所调用的符号)。
    • 接下来是#[lang = "start"]。如果 crate 图中不存在 #[start],则编译器会生成一个调用它的 main 函数。此函数接收 argc/argv 以及第三个参数,该参数是指向 #[main] 函数(定义如下)的函数指针。重要的是,#[lang = "start"] 可以位于库中。例如,它位于标准库 (libstd) 中。
    • 最后,#[main],一个可执行文件的主函数。这不传递任何参数,并由#[lang = "start"] 调用(如果它决定)。标准库使用它来初始化自身,然后调用 Rust 程序。如果未指定,则默认为顶部的 fn main

    所以要回答你的问题,这与#[start] 不同。要回答您的其他(可能尚未提出)问题,是的,我们有太多的切入点。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2011-09-24
    • 2014-09-02
    相关资源
    最近更新 更多