2010-04-24 6 views
5

समाप्त हैंडलर के बारे में,निरस्त() और समाप्त() "लाइव" कहां है?

मैं यह समझ के रूप में, जब कुछ बुरा कोड में क्या होता है, उदाहरण के लिए, जब हम एक अपवाद को पकड़ने नहीं है,

समाप्त() कहा जाता है, जो बारी में कॉल गर्भपात()

set_terminate (my_function) हमें उपयोगकर्ता निर्दिष्ट फ़ंक्शन my_terminate को कॉल करने के लिए समाप्त() को समाप्त करने की अनुमति देता है।

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

+0

आप समारोह है कि _you_ फोन के लिए शीर्ष लेख शामिल करने के लिए है द्वारा हैंडलर समाप्त। इसलिए, आपका कथन "किसी भी हेडर फ़ाइल को शामिल किए बिना" 'set_terminate()' पर लागू नहीं होता है। – MSalters

उत्तर

5

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

आम तौर पर, प्रत्येक प्रोग्राम रनटाइम लाइब्रेरी (उदाहरण के लिए glibc लिनक्स के तहत) से जुड़ा हुआ है। अन्य कारणों से, ऐसा इसलिए है क्योंकि रनटाइम लाइब्रेरी में आवश्यक चीज़ों के लिए "छुपा" कोड होता है, उदा। कोड जो स्टार्टअप पर आपके main फ़ंक्शन को कॉल करता है।

+1

धन्यवाद stakx, रनटाइम लाइब्रेरी की उपस्थिति चीजों को बताती है। – aCuria

3

आप क्यों लगता है कि एक शीर्ष लेख शामिल करने के लिए कोई जरूरत नहीं है मैं नहीं दिख रहा है:

int main() { 
    abort(); 
} 

मेरे लिए निम्न त्रुटि देता है:

error: 'abort' was not declared in this scope 

न तो सी है और न ही सी है ++ किसी भी "विशेष "फ़ंक्शन - यदि आप किसी फ़ंक्शन का उपयोग करना चाहते हैं, तो आपको इसे किसी भी तरह घोषित करना होगा। ये दो सी ++ मानक पुस्तकालय में रहते हैं, और cstdlib और exception में घोषित किए जाते हैं। बेशक, ये शीर्षलेख स्वयं अन्य शीर्षकों द्वारा शामिल किए जा सकते हैं, इस प्रकार कार्यों को उपलब्ध करा सकते हैं, लेकिन यह मानक द्वारा निर्दिष्ट नहीं है।

+2

@Neil: मुझे लगता है कि वह इस तथ्य का जिक्र कर रहा है कि डिफ़ॉल्ट अप्रत्याशित फ़ंक्शन कॉल को समाप्त कर देता है(), फिर भी उपयोगकर्ता को उस शीर्षलेख को शामिल करने की आवश्यकता नहीं है जिसमें कार्य करने के क्रम में समाप्ति() शामिल है। –

2

set_terminate - समाप्त हैंडलर समारोह

सेट च के रूप में समाप्त हैंडलर समारोह।

एक समाप्ति हैंडलर फ़ंक्शन स्वचालित रूप से एक फ़ंक्शन होता है जब किसी कारण से अपवाद हैंडलिंग प्रक्रिया को त्यागना पड़ता है। ऐसा तब होता है जब एक हैंडलर फेंकने वाले अपवाद के लिए नहीं पाया जा सकता है, या किसी अन्य असाधारण परिस्थिति के लिए जो हैंडलिंग प्रक्रिया को जारी रखना असंभव बनाता है।

डिफ़ॉल्ट कॉल cstdlib's abort समारोह

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