2016-06-28 27 views
10

In C e C++ è possibile ottenere il nome della funzione attualmente in esecuzione tramite la macro __func__ con C99 & C++ 11 e ___FUNCTION___ per MSVC.Equivalente di __func__ o __FUNCTION__ in Rust?

Esiste un equivalente di questo in Rust?

Esempio di __func__ in C:

#include "stdio.h" 

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

int main() { 
    funny_hello(); 
} 

uscite Hello from funny_hello.

risposta

9

C'era un RFC su questo, ma non è mai stato concordato o implementato.

Il razionale per la sua assenza:

"In generale non credo che nessuno di noi hanno dato una quantità eccessiva di pensiero a questi 'debugging correlate' le macro in termini di lungo termine stabilità. La maggior parte di essi sembra abbastanza innocua, ma affidarsi a fornisce tutti loro per tutti i programmi di Rust è un forte impegno . Potremmo voler considerare brevemente la storia di questi macro insieme alla possibilità di aggiungere questa nuova macro. "

Forse Rust avrà qualcosa di paragonabile, in futuro,
ma per ora sarà necessario fare affidamento sul proprio tagging.

lato nota:__FUNCTION__ è non standard, __func__ esiste in C99/C++ 11.

3

Se siete OK con l'utilizzo solo su instabile, è possibile incidere un insieme 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] 
    }} 
} 

e, naturalmente, è possibile utilizzare cfg a ripiegare ad un default noioso nella scuderia

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

Si noti che questo fornisce un percorso completo, quindi my::path::my_func anziché solo my_func. A demo is available.

+0

Si noti che questa implementazione ha anche il limite che non può essere utilizzata attualmente per costruire valori statici, ad esempio: 'nome statico: & 'static str = function!();' –