2016-06-28 3 views
10

In C und C++ können Sie den Namen der aktuell ausgeführten Funktion über das Makro __func__ mit C99 & C++ 11 und ___FUNCTION___ für MSVC abrufen.Equivalent von __FUNC__ oder __FUNCTION__ in Rust?

Gibt es ein Äquivalent von diesem in Rust?

Beispiel __func__ in C:

#include "stdio.h" 

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

int main() { 
    funny_hello(); 
} 

Ausgänge Hello from funny_hello.

Antwort

9

Es gab eine RFC darüber, aber es wurde nie vereinbart oder umgesetzt werden.

Der Grund für seine Abwesenheit:

„Im Allgemeinen glaube ich, keiner von uns haben eine ungeregelte Menge Gedanken zu diesen gegeben‚Debugging im Zusammenhang‘Makros in Bezug auf die langfristige Stabilität . die meisten von ihnen scheinen ziemlich harmlos, aber alle von ihnen begehen immer für alle Rust-Programme bieten eine starke Engagement zu machen. Wir möchten die Geschichte dieser Makros in Verbindung mit Berücksichtigung Hinzufügen dieser neuen Makro kurz betrachten zu.“

Vielleicht Rust haben etwas Vergleichbares in der Zukunft,
aber jetzt werden Sie auf Ihre eigene Tagging verlassen.

Randbemerkung:__FUNCTION__ ist nicht Standard existiert __func__ in C99/C++ 11.

3

Wenn Sie es mit der Verwendung nur auf instabilen OK sind, können Sie ein Hack zusammen mit 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] 
    }} 
} 

und natürlich können Sie cfg verwenden zurück zu einem langweiligen Standard in stabilen

fallen
#![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>" }} 
} 

Beachten Sie, dass dies einen vollständigen Pfadnamen ergibt, also my::path::my_func anstatt nur my_func. A demo is available.

+0

Bitte beachten Sie, dass diese Implementierung auch die Begrenzung hat, dass es nicht zur Zeit statische Werte bauen verwendet werden kann, z: 'statischer Name: & 'static str = function();'! –