2016-06-28 39 views
10

在C和C++中,您可以通过使用C99 & C++ 11和___FUNCTION___的宏,通过__func__宏获取当前正在执行的函数的名称。Rust中__func__或__FUNCTION__的等价物?

在Rust里有没有相当于这个的?在C __func__

实施例:

#include "stdio.h" 

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

int main() { 
    funny_hello(); 
} 

输出Hello from funny_hello

回答

9

有关于此的RFC,但它从未同意或实施。

其缺席的理由:

“总的来说,我不认为我们任何人都给予 思想的过多的这些‘长期 稳定性方面相关的’宏调试。他们中的大多数看起来相当无害,但承诺 为所有Rust程序提供所有这些永远是一个强大的 承诺,我们可能想要简单考虑这些 宏的故事,并考虑添加这个新宏。

也许锈病将有一些在未来相当,
但现在你需要靠你自己的标记。

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

3

如果你是使用很不稳定OK,你可以与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_funcA demo is available.

+0

请注意,这个实现还有一个局限性,它现在不能用来构建静态值,例如:'static name:&'static str = function!();' –