在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
。
有一个 RFC 关于这一点,但它从未达成一致或实施。
缺席的理由:
“总的来说,我认为我们中的任何一个人都没有过多
从长远来看,这些“调试相关”的宏
稳定性。他们中的大多数似乎相当无害,但承诺
为所有Rust程序提供所有这些永远是强大的
承诺。我们可能想简要地考虑一下这些故事
宏与结合考虑添加这个新的宏。“
也许Rust将来会有类似的东西,
但是现在你需要依靠自己的标记。
边注: __FUNCTION__
不标准, __func__
存在于C99 / C ++ 11中。
如果你只在不稳定的情况下使用它,你可以和它一起攻击 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
。 有一个演示版。
有一个 RFC 关于这一点,但它从未达成一致或实施。
缺席的理由:
“总的来说,我认为我们中的任何一个人都没有过多
从长远来看,这些“调试相关”的宏
稳定性。他们中的大多数似乎相当无害,但承诺
为所有Rust程序提供所有这些永远是强大的
承诺。我们可能想简要地考虑一下这些故事
宏与结合考虑添加这个新的宏。“
也许Rust将来会有类似的东西,
但是现在你需要依靠自己的标记。
边注: __FUNCTION__
不标准, __func__
存在于C99 / C ++ 11中。
如果你只在不稳定的情况下使用它,你可以和它一起攻击 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
。 有一个演示版。