2010-02-17 10 views
17

जीसीसी 4.4.2 और WinXP दृश्य स्टूडियो सी ++ 2008क्रॉस-प्लेटफॉर्म मैक्रो के लिए #define __FUNCTION__ और __func__

#if defined (WIN32) 
#define __FUNCTION__ __func__ 
#endif 

मैं समारोह नाम प्रदर्शित करने के लिए मैक्रो का उपयोग करना चाहते हैं के रूप में के साथ संकलन को परिभाषित। मैंने किया है इसके बाद के संस्करण तो मैं पार मंच सकते हैं, और जब लिनक्स या खिड़कियों पर संकलन एक ही समारोह का उपयोग करें।

हालांकि, जब मैं WinXP पर संकलन कर रहा हूँ मैं निम्नलिखित त्रुटि मिलती है:

__func__ undeclared identifier 

मैं इस तरह एक मैक्रो #define नहीं कर सकते?

किसी भी सुझाव के लिए बहुत धन्यवाद,

+3

आपको #if परिभाषित (_WIN32) के बजाय #if परिभाषित (_MSC_VER) का उपयोग करना चाहिए। सवाल यह नहीं है कि आप किस ओएस का उपयोग कर रहे हैं। सवाल यह है कि आप किस कंपाइलर का उपयोग कर रहे हैं। –

उत्तर

24

ऐसा लगता है कि आप अपने #define पिछड़े है आप इसे इस तरह लग रहे बनाने की आवश्यकता होगी। तुम दोनों प्लेटफार्मों पर __func__ उपयोग करना चाहते हैं, और WIN32 __FUNCTION__ नहीं बल्कि __func__ है, तो आप के बजाय ऐसा करने की जरूरत:

#if defined (WIN32) 
#define __func__ __FUNCTION__ 
#endif 

जानना आवश्यक है कि __func__ या नहीं परिभाषित करने की जरूरत एक बेहतर तरीका हो सकता है, लेकिन यह त्वरित हैक चाल करना चाहिए।

याद रखें, compilers कि __FUNCTION__ और __func__ कीवर्ड का समर्थन पर, वे मैक्रो नहीं कर रहे हैं तो आप ऐसा नहीं कर सकते निम्नलिखित (के बाद से #ifndef __func__ मान्य नहीं है):

#ifndef __func__ 
#define __func__ __FUNCTION__ 
#endif 

C99 कल्पना से:

6.4.2.2 Predefined identifiers

1 The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name"; 

appeared, where function-name is the name of the lexically-enclosing function.

+0

धन्यवाद कि काम किया। लेकिन मुझे सोच रहा है। जब आप कहते हैं कि __FUNCTION__ और __func__ मैक्रोज़ नहीं हैं। आप # परिभाषा में परिभाषित क्यों नहीं कर सकते हैं। यह भी कैसे पता चलेगा कि यह एक मैक्रो या कीवर्ड है या नहीं? बहुत धन्यवाद। – ant2009

+1

यह एक अच्छा सवाल है - मुझे लगता है कि आपको पता लगाने के लिए एएनएसआई स्पेक (या Google) पर जाना होगा। इस मामले में, '__func__' एक" पूर्वनिर्धारित पहचानकर्ता "है और विवरण के आधार पर, फ़ंक्शन में परिभाषित स्थिर स्थिरांक चर की तरह कार्य करता है। उपर्युक्त मेरे उदाहरण में, जो हिस्सा काम नहीं करेगा वह '__func__' है, इसलिए मैक्रो प्री-प्रोसेसर के लिए एक परिभाषित मैक्रो दिखाई नहीं दे रहा है। – tomlogic

1

आप जैसे मेक्रो के पाठ्यक्रम #define कर सकते हैं। FUNCTION के हर उदाहरण तो __func__ ने ले ली है। हालांकि, obviosuly आपके कंपाइलर __func__ नहीं जानता है। मेरा मानना ​​है कि वीसी __FUNCTION__ जानता है, इसलिए

#if defined (WIN32) 
# define __func__ __FUNCTION__ 
#endif 

ऐसा कर सकता है।

+0

क्षमा करें, लेकिन यह भी काम नहीं किया। धन्यवाद। – ant2009

+0

'__FUNCTION__' नहीं एक मैक्रो है, तो आप उस पर एक #ifdef नहीं हो सकता है। '__func__' के साथ, यह या तो संकलक के लिए एक कीवर्ड है या यह नहीं है। – tomlogic

+0

@tomlogic: हाँ, तुम सही हो। मैंने ठीक कर दिया। – sbi

2

आप किसी भी संकलक C99 का समर्थन करता है कि किसी भी स्पष्ट मैक्रो बिना __func__ उपयोग करने के लिए सक्षम होना चाहिए।

+1

हां, मैं इसका उपयोग c89/c99 में कर सकता हूं। हालांकि, विजुअल स्टूडियो 2008 __FUNCTION__ का उपयोग करता है। मैं # परिभाषित करने की कोशिश कर रहा था ताकि मैं विंडोज और लिनक्स दोनों के लिए एक ही मैक्रो का उपयोग कर सकूं। धन्यवाद। – ant2009

6

__FUNCTION__ मैक्रो MSVC संकलक में पूर्व निर्धारित है। यदि आप चाहें, चारों ओर

#ifndef _MSC_VER 
#define __FUNCTION__ __func__ 
#endif 

या अन्य तरीके से:

#ifdef _MSC_VER 
#define __func__ __FUNCTION__ 
#endif 
+0

मैंने कोशिश की, और अभी भी वही त्रुटि मिली है। मैंने इस स्थिति में भी कोशिश की (__MSVC__), और एक ही त्रुटि मिली।कोई और सुझाव। धन्यवाद। – ant2009

+0

शायद यह मेरा, लेकिन जब मैं उन 2 कोशिश करता हूं तो मुझे त्रुटि मिलती है: "#if [n] def एक पहचान की उम्मीद है"। धन्यवाद। – ant2009

+0

@robUK - ओह, मूल स्निपेट ने मुझे परेशानी में डाल दिया। फिक्स्ड। –

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