2016-06-28 36 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!();' –