2012-06-26 14 views
13

मेरे पास एक ऐसा मैक्रो लाइन नंबर और एक त्रुटि हैंडलर के लिए फ़ाइल नाम से गुजरता है:व्यवहार

#define SYSTEM_FAILURE (error_code, comment) \ 
    System_Failure((error_code), (comment), __LINE__, __FILE__); 

कैसे जब एक inlined समारोह के अंदर इस्तेमाल __LINE__ का समाधान हो जाएगा?

file.h: 
inline int divide(int x, int y) 
{ 
    if (y == 0) 
    { 
     SYSTEM_FAILURE(ENUM_DIVIDE_BY_ZERO, "divide by zero error"); 
    } 
    return x/y; 
} 

__LINE__ हेडर फाइल के भीतर लाइन नंबर, या जहां इनलाइन समारोह (यह मानते हुए संकलक एक स्रोत कोड में "पेस्ट" करता है) कहा जाता है स्रोत फ़ाइल की लाइन नंबर शामिल करेंगे?

+2

यह कोशिश नहीं कर सकता क्योंकि व्यवहार कंपाइलरों पर भिन्न हो सकता है और मानक राज्य नहीं हो सकता है। –

+2

डाउनवॉटर: डाउनवोट क्यों? प्रश्न एक एम्बेडेड सिस्टम में सी, इनलाइन फ़ंक्शंस और मैक्रोज़ का उपयोग करने से उत्पन्न होता है। –

+1

@ थॉमस, अपने स्वयं के कंपाइलर पर इसका परीक्षण करें और अपने प्रश्न में परिणाम शामिल करें (इस प्रकार इसे 'मेरे प्रीप्रोसेसर ने ऐसा किया है, क्या यह मानक है?') डाउनवॉट्स में से कई को न्यूरर (और अभी भी कर सकते हैं) होगा। –

उत्तर

20

सी और सी ++ में, मैक्रोज़ (अधिकांश भाग के लिए) वास्तविक कोड के किसी भी ज्ञान के साथ मूल्यांकन नहीं किए जाते हैं और कोड से पहले संसाधित होते हैं (इसलिए नाम "प्रीप्रोसेसर")। इसलिए, __FILE__ "file.h" का मूल्यांकन करेगा, और __LINE__ उस पंक्ति से संबंधित लाइन नंबर का मूल्यांकन करेगा जिस पर SYSTEM_FAILURE file.h में प्रकट होता है।

7

चूंकि मैक्रोज़ संकलन से पहले उनकी परिभाषाओं द्वारा प्रतिस्थापित किए जाते हैं, इसलिए __LINE__ में उस फ़ाइल की वास्तविक पंक्ति होगी जिसमें आपने मैक्रो का उपयोग किया था। इनलाइनिंग इस व्यवहार को बिल्कुल प्रभावित नहीं करेगी।

3

__LINE__ शीर्षलेख फ़ाइल की रेखा होगी क्योंकि प्रीप्रोसेसर इसका मूल्यांकन करेगा इससे पहले कि संकलक इसे कभी देखेगा।

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