2016-06-28 2 views
10

CおよびC++では、__func__マクロを使用して、現在実行中の関数の名前をC99 & C++ 11および___FUNCTION___(MSVC用)に取得できます。錆の__func__または__FUNCTION__に相当しますか?

錆にはこれに相当するものはありますか? 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] 
    }} 
} 

と一緒に1をハックすることができますし、もちろん、あなたが安定し

に戻って退屈なデフォルトにフォール 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_funcの代わりにmy::path::my_funcを指定してください。 A demo is available.

+0

この実装では、静的な値を作成するために現在使用できないという制限もあります。たとえば、次のようになります。static str = function!(); ' –

関連する問題