2016-06-28 5 views
10

सी और सी ++ में आप वर्तमान में निष्पादन समारोह का नाम __func__ मैक्रो के माध्यम से सी 99 & सी ++ 11 और ___FUNCTION___ एमएसवीसी के लिए प्राप्त कर सकते हैं।__func__ या जंग में __FUNCTION__ के समतुल्य?

वहाँ जंग में इस बात का एक बराबर है? सी में __func__ की

उदाहरण:

#include "stdio.h" 

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

int main() { 
    funny_hello(); 
} 

आउटपुट Hello from funny_hello

उत्तर

9

इस बारे में एक RFC था, लेकिन इस पर सहमति या लागू नहीं किया गया।

अपनी अनुपस्थिति के लिए तर्क:

"सामान्य तौर पर मुझे नहीं लगता कि हम में से कोई भी इन करने के लिए सोचा था की एक अत्यधिक राशि दे दिया है" "लंबी अवधि के स्थिरता के संदर्भ में संबंधित मैक्रो डिबगिंग। उनमें से अधिकांश काफी हानिरहित लग, लेकिन करने से सब जंग कार्यक्रमों के लिए उन सभी को प्रदान करते हैं हमेशा के लिए एक मजबूत बनाने के लिए। हम संक्षेप में इस नए मैक्रो जोड़ने पर विचार के साथ संयोजन के रूप में इन मैक्रो की कहानी पर विचार कर सकते प्रतिबद्धता है। "

शायद जंग कुछ भविष्य में तुलनीय होगा,
लेकिन अभी के लिए आप अपने खुद के टैगिंग पर भरोसा करने की आवश्यकता होगी।

ओर ध्यान दें:__FUNCTION__, गैर मानक है __func__ C99/C++ 11 में मौजूद है।

3

आप केवल अस्थिर पर उपयोग के साथ ठीक कर रहे हैं, तो आप एक साथ 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_func के बजाय my::path::my_funcA demo is available.

+0

कृपया ध्यान दें कि इस कार्यान्वयन में भी सीमा है कि वर्तमान में स्थिर मान बनाने के लिए इसका उपयोग नहीं किया जा सकता है, उदाहरण: 'स्थिर नाम: और 'स्थिर str = function!();' –

संबंधित मुद्दे