在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();
}
Run Code Online (Sandbox Code Playgroud)
输出Hello from funny_hello.
Tro*_*els 10
看来function_namecrate 可以做到这一点。
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",
);
}
Run Code Online (Sandbox Code Playgroud)
我没有参与该项目,也没有实际尝试过。
您可以与一起破解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]
}}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这给出了完整的路径名,所以my::path::my_func不只是my_func。演示可用。
添加到Veedrac 的答案中,您可以通过添加以下内容来获取没有完整路径的函数名称:
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],
}
}};
}
Run Code Online (Sandbox Code Playgroud)
你会得到my_func而不是my::path::my_func例如。