问题 在Rust中等效__func__或__FUNCTION__?


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

Rust中有相同的这个吗?

例子 __func__ 在C:

#include "stdio.h"

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

int main() {
    funny_hello();
}

输出 Hello from funny_hello


4217
2018-06-28 23:48


起源



答案:


有一个 RFC 关于这一点,但它从未达成一致或实施。

缺席的理由:

“总的来说,我认为我们中的任何一个人都没有过多   从长远来看,这些“调试相关”的宏   稳定性。他们中的大多数似乎相当无害,但承诺   为所有Rust程序提供所有这些永远是强大的   承诺。我们可能想简要地考虑一下这些故事   宏与结合考虑添加这个新的宏。“

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

边注:  __FUNCTION__ 不标准, __func__ 存在于C99 / C ++ 11中。


10
2018-06-29 00:12





如果你只在不稳定的情况下使用它,你可以和它一起攻击 type_name

#![feature(core_intrinsics)]

macro_rules! function {
    () => {{
        fn f() {}
        fn type_name_of<T>(_: T) -> &'static str {
            extern crate core;
            unsafe { core::intrinsics::type_name::<T>() }
        }
        let name = type_name_of(f);
        &name[6..name.len() - 4]
    }}
}

当然,你可以使用 cfg 在稳定中回归无聊的默认

#![cfg_attr(feature = "type_name", feature(core_intrinsics))]

#[cfg(feature = "type_name")]
macro_rules! function {
    ... // as before
}

#[cfg(not(feature = "type_name"))]
macro_rules! function {
    () => {{ "<fn>" }}
}

请注意,这给出了一个完整的路径名,所以 my::path::my_func 而不仅仅是 my_func有一个演示版。


3
2017-10-25 08:10



请注意,此实现还具有当前无法用于构建静态值的限制,例如: static name : &'static str = function!(); - Dan Aloni


答案:


有一个 RFC 关于这一点,但它从未达成一致或实施。

缺席的理由:

“总的来说,我认为我们中的任何一个人都没有过多   从长远来看,这些“调试相关”的宏   稳定性。他们中的大多数似乎相当无害,但承诺   为所有Rust程序提供所有这些永远是强大的   承诺。我们可能想简要地考虑一下这些故事   宏与结合考虑添加这个新的宏。“

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

边注:  __FUNCTION__ 不标准, __func__ 存在于C99 / C ++ 11中。


10
2018-06-29 00:12





如果你只在不稳定的情况下使用它,你可以和它一起攻击 type_name

#![feature(core_intrinsics)]

macro_rules! function {
    () => {{
        fn f() {}
        fn type_name_of<T>(_: T) -> &'static str {
            extern crate core;
            unsafe { core::intrinsics::type_name::<T>() }
        }
        let name = type_name_of(f);
        &name[6..name.len() - 4]
    }}
}

当然,你可以使用 cfg 在稳定中回归无聊的默认

#![cfg_attr(feature = "type_name", feature(core_intrinsics))]

#[cfg(feature = "type_name")]
macro_rules! function {
    ... // as before
}

#[cfg(not(feature = "type_name"))]
macro_rules! function {
    () => {{ "<fn>" }}
}

请注意,这给出了一个完整的路径名,所以 my::path::my_func 而不仅仅是 my_func有一个演示版。


3
2017-10-25 08:10



请注意,此实现还具有当前无法用于构建静态值的限制,例如: static name : &'static str = function!(); - Dan Aloni