2012-08-27 8 views
5

मैं निम्नलिखित कार्य हो कहते हैं:क्या मैं कंप्रेसर को रिटर्न वैल्यू के संबंध में बंद नियंत्रण पथ पर विचार करने के लिए कह सकता हूं?

Thingy& getThingy(int id) 
{ 
    for (int i = 0; i < something(); ++i) 
    { 
     // normal execution guarantees that the Thingy we're looking for exists 
     if (thingyArray[i].id == id) 
      return thingyArray[i]; 
    } 

    // If we got this far, then something went horribly wrong and we can't recover. 
    // This function terminates the program. 
    fatalError("The sky is falling!"); 

    // Execution will never reach this point. 
} 

संकलनकर्ता आम तौर पर, इस पर शिकायत करते हुए कहा कि "नहीं सभी नियंत्रण पथ मान"। जो तकनीकी रूप से सत्य है, लेकिन नियंत्रण पथ जो फ़ंक्शन समाप्त होने से पहले प्रोग्राम को रोकते हैं, और इसलिए अर्थात् सही हैं। क्या संकलक को बताने का कोई तरीका है (मेरे मामले में वीएस -2010, लेकिन मैं दूसरों के बारे में भी उत्सुक हूं) कि इस जांच के प्रयोजनों के लिए एक निश्चित नियंत्रण पथ को अनदेखा किया जाना चाहिए, पूरी तरह से चेतावनी को दबाए बिना या एक गैरकानूनी डमी लौटाए समारोह के अंत में मूल्य?

उत्तर

8

आप संकलक को fatalError (इसकी घोषणा) को एनोटेट कर सकते हैं ताकि संकलक को यह पता चल सके कि यह कभी वापस नहीं आएगा।

सी ++ 11 में, कुछ इस तरह होगा:

[[noreturn]] void fatalError(std::string const&); 

पूर्व सी ++ 11, आप इस तरह जीसीसी के रूप में संकलक विशिष्ट विशेषताओं, है:

void fatalError(std::string const&) __attribute__((noreturn)); 

या दृश्य स्टूडियो के:

__declspec(noreturn) void fatalError(std::string const&); 
+2

या, विजुअल C++ '__declspec (noreturn) के लिए' –

+0

यह फ़ंक्शन केवल वापस आ जाएगी कुछ भी नहीं है, जब असाधारण पथ लिया जाता है के रूप में लागू नहीं होता। – Nobody

+1

@ नोबॉडी उस घातक को कभी वापस लौटने की घोषणा नहीं की जाती है इसका मतलब यह नहीं है कि GetThingy मामलों में नहीं हो सकता है घातक त्रुटि नहीं कहा जाता है। –

2

आप अपवाद क्यों नहीं फेंकते? इससे समस्या हल हो जाएगी और यह अपवाद से निपटने के लिए कॉलिंग विधि को मजबूर करेगी।

यदि आपने कुछ तरीकों से या अन्य चेतावनी को छेड़छाड़ करने का प्रबंधन किया है, तो आप अभी भी उस कार्य के साथ कुछ करने के लिए बाएं हैं जो getThingy() को कॉल करता है। क्या होता है जब GetThingy() विफल रहता है? कॉलर कैसे पता चलेगा? आपके पास यहां एक अपवाद है (अवधारणात्मक रूप से) और आपके डिज़ाइन को इसे प्रतिबिंबित करना चाहिए।

+1

मैं पुष्टि कर सकता हूं कि मेरा जीसीसी (4.6.2) चेतावनी को ट्रिगर नहीं करता है फेंकने से पहले फेंक दिया जाता है '}। यदि आप अपने कोड से चिपकना चाहते हैं तो आप आसानी से' फेंक 0 'जोड़ सकते हैं, या' fatalError ... ' – Nobody

+1

के बाद बराबर कुछ टिप्पणी कहती है "अगर हमें यह दूर मिला, तो कुछ गड़बड़ हो गया और हम ठीक नहीं हो पाएंगे। "उस मामले में, कार्यक्रम की समाप्ति (उदाहरण के लिए एक दावा या" घातक "के माध्यम से) उचित है। –

+0

@anio: मैं व्यक्तिगत रूप से 'फेंकने' के लिए कार्यों का उपयोग करता हूं ताकि मैं कुछ स्वरूपण और त्रुटि संदेशों में सुधार कर सकते हैं (उदाहरण के लिए एक स्टैक ट्रेस एकत्र करना)। यह एक नंगे 'फेंक' कथन से समृद्ध है, इस प्रकार एक अच्छा डिबगिंग ई बनाता है xperience। –

2

आप अपने fatalError दिनचर्या के बदले एक रन टाइम दावा का उपयोग कर सकते हैं। यह सिर्फ लगेगा जैसे:

Thingy& getThingy(int id) 
{ 
    for (int i = 0; i < something(); ++i) 
    { 
     if (thingyArray[i].id == id) 
      return thingyArray[i]; 
    } 
    // Clean up and error condition reporting go here. 
    assert(false); 
} 
+0

यह काम करेगा लेकिन कोर डंप का इतना अच्छा दुष्प्रभाव नहीं होगा। – anio

+1

विफलता को जन्म देने वाली स्थिति पर्याप्त रूप से दुर्लभ होने पर कोर डंप उपयोगी हो सकती है। – andand

+0

यह केवल डीबग बिल्ड में काम करेगा। रिलीज निर्माण में जोर देना कुछ भी चेतावनी जारी नहीं है। – magras

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

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