【问题标题】:Equivalent of __func__ or __FUNCTION__ in Rust?Rust 中 __func__ 或 __FUNCTION__ 的等价物?
【发布时间】:2016-10-31 11:32:30
【问题描述】:

在 C 和 C++ 中,您可以通过 C99 和 C++11 的 __func__ 宏以及 MSVC 的 ___FUNCTION___ 获取当前正在执行的函数的名称。

Rust 中是否有这样的等价物?

C 中__func__ 的示例:

#include "stdio.h"

void funny_hello() {
    printf ("Hello from %s\n", __func__);
}

int main() {
    funny_hello();
}

输出Hello from funny_hello

【问题讨论】:

    标签: macros rust


    【解决方案1】:

    看来function_name crate 会这样做。

    https://docs.rs/function_name/latest/function_name/

    文档中的示例是

    use ::function_name::named;
    
    #[named]
    fn my_super_duper_function ()
    {
        assert_eq!(
            function_name!(),
            "my_super_duper_function",
        );
    }
    

    我没有参与这个项目,也没有实际尝试过。

    【讨论】:

    • 我刚试过这个,它似乎像宣传的那样工作。
    【解决方案2】:

    添加到Veedrac's answer,您可以通过添加以下内容来获取没有完整路径的函数名称:

    macro_rules! function {
        () => {{
            fn f() {}
            fn type_name_of<T>(_: T) -> &'static str {
                std::any::type_name::<T>()
            }
            let name = type_name_of(f);
    
            // Find and cut the rest of the path
            match &name[..name.len() - 3].rfind(':') {
                Some(pos) => &name[pos + 1..name.len() - 3],
                None => &name[..name.len() - 3],
            }
        }};
    }
    

    例如,您将获得my_func 而不是my::path::my_func

    【讨论】:

      【解决方案3】:

      你可以和std::any::type_name一起破解一个。

      macro_rules! function {
          () => {{
              fn f() {}
              fn type_name_of<T>(_: T) -> &'static str {
                  std::any::type_name::<T>()
              }
              let name = type_name_of(f);
              &name[..name.len() - 3]
          }}
      }
      

      请注意,这给出了一个完整的路径名,所以my::path::my_func 而不仅仅是my_funcA demo is available.

      【讨论】:

      • 请注意,这个实现也有限制,它目前不能用于构建静态值,例如:static name : &amp;'static str = function!();
      • 请注意,如果 my_func 是异步 fn,这将给出 my::path::my_func::{{closure}}。
      【解决方案4】:

      对此有一个RFC,但从未达成一致或实施。

      它缺席的理由:

      “总的来说,我不认为我们中的任何人都给予了过多的 从长远角度考虑这些“调试相关”的宏 稳定。他们中的大多数人看起来相当无害,但致力于 永远为所有 Rust 程序提供所有这些是一个强大的 作出的承诺。我们不妨简要地考虑一下这些人的故事 宏以及考虑添加这个新宏。”

      也许 Rust 将来会有类似的东西,
      但现在您需要依赖自己的标记。

      旁注: __FUNCTION__ 是非标准的,__func__ 存在于 C99 / C++11 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-23
        相关资源
        最近更新 更多