2009-02-17 9 views
12

कई सालों से सी में प्रोग्रामिंग के बाद, मुझे एहसास हुआ कि मैं सफलता को इंगित करने के लिए एक समारोह से शून्य लौटने के सी सम्मेलन को अनदेखा कर रहा हूं। सम्मेलन मेरे लिए अर्थपूर्ण रूप से गलत लगता है, क्योंकि शून्य निश्चित रूप से झूठा है। समस्या मैं is_valid_foobar() जैसे कार्यों के लिए इच्छित नाम है, और आदेश 'गलत साधन सफलता' के सम्मेलन में समायोजित करने के लिए, मैं और अधिक अस्पष्ट होना चाहिए था ... के बजाय यह है कि:क्या मुझे सी फ़ंक्शन से TRUE/FALSE मान वापस करना चाहिए?

if (! is_valid_foobar()) { 
    return (error); 
} 

अन्य प्रोग्रामर लिखें:

if (validate_foobar()) { 
    return (error); 
} 

और मेरे कार्यान्वयन लगता है:

int is_valid_foobar (int foobar) { 
    if (foobar < MAX_ALLOWED) { 
      return TRUE; 
     } 
     return FALSE; 
} 

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

मैं फ़ंक्शन और परिवर्तनीय नामों के लिए किए गए विकल्पों के बारे में बहुत सावधान हूं, और एक सामान्य समीक्षा टिप्पणी "कोड वास्तव में स्पष्ट है", और आगे यह मुझे अतिरिक्त टाइप करने के लिए परेशान नहीं करता है फंक्शन कॉल के सामने !। लेकिन क्या आप कहते हैं, हे एसओ के शक्तिशाली लोग?

उत्तर

19

मैं दोनों, सही कर रहे हैं विभिन्न प्रयोजनों के लिए कहेंगे:

आप एक सरल जाने प्रस्तुति दे रहे हैं/no-जाना सत्यापन, उदा is_numeric(), तो सही और गलत काम अच्छी तरह से।

कुछ और विस्तृत के लिए, 0 == सफलता प्रतिमान उपयोगी है जिसमें यह एक से अधिक त्रुटि की स्थिति को वापस करने की अनुमति देता है।

इस मामले में, कॉलर आसानी से 0 के खिलाफ परीक्षण कर सकता है, या असफलता के अधिक विशिष्ट स्पष्टीकरण के लिए गैर-0 रिटर्न की जांच कर सकता है। जैसे गैर-अस्तित्व, अपर्याप्त अनुमतियों आदि के कारण फ़ाइल खुली कॉल विफल हो सकती है।

+0

राइट - और यदि आप सफलता के लिए सीधे 0 का उपयोग करना पसंद नहीं करते हैं, तो आम तौर पर फ्रेमवर्क या प्लेटफार्म कुछ सफलता या (दिलचस्प रूप से नामित) ERROR_SUCCESS मैक्रो/मान (संबंधित त्रुटि कोड नामों के साथ) को संख्यात्मक से दूर करने के लिए कुछ प्रदान करते हैं कुछ हद तक मूल्य। –

+0

यह उपयोग फ़ॉर्मूलेशन "अगर (int e = foo()) {/ * हैंडल त्रुटियों * /};", जो अधिक फीचरफुल भाषाओं पर उठाए गए लोगों के लिए घबराहट लग सकता है, लेकिन सी मानकों द्वारा साफ और चिकना है। – dmckee

3

मुझे यकीन नहीं है कि मैं सहमत हूं कि "सफलता का संकेत देने के लिए किसी फ़ंक्शन से शून्य लौटने" का एक सम्मेलन है।

AFAIK, सम्मेलन यह है कि शून्य गलत है, और सभी nonzeros भविष्यवाणियों के मामले में सच हैं।

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

वापसी मूल्यों के लिए, निश्चित वापसी मूल्यों का उपयोग करने में कुछ भी गलत नहीं है, यह सबकुछ अधिक सुविधाजनक बनाता है।

बड़ा जोखिम, आईएमएचओ, यह है कि बहुत से लोग अपने स्वयं के स्थिरांक घोषित करते हैं, और जब अन्य एक ही फाइल का उपयोग करते हैं, तो आप अपने स्वयं के स्थिरांक के साथ संघर्ष में भागना शुरू करते हैं। तो लाइन के नीचे किसी और के सत्य/गलत के साथ आपका सत्य/गलत और संघर्ष।

2

यह संयुक्त राष्ट्र * एक्स खोल एक के रूप में इतना सी सम्मेलन नहीं है। मानक सी iasalpha(), isdigit() आदि कार्यों पर विचार करें। वे सभी सफलता को इंगित करने के लिए शून्य-शून्य लौटते हैं। निचली पंक्ति: सी 'सत्य' में शून्य नहीं है।

+0

+1।इसके अलावा, यूनिक्स/लिनक्स में ये सम्मेलन एक दूसरे के साथ कॉलिंग और पाइपिंग कार्यक्रमों (अलग प्रक्रियाओं) पर लागू होते हैं, जो एक ही प्रोग्राम के अंदर एक-दूसरे को कॉल करने में काम नहीं करते हैं, हालांकि सम्मेलन समान है। – heltonbiker

11

सम्मेलन बिल्कुल वैसा ही नहीं है जो आपको लगता है।सफलता को इंगित करने के लिए प्रक्रियाओं को 0 स्थिति से बाहर निकलना चाहिए, और कार्य करता है जो त्रुटि कोड अक्सर "कोई त्रुटि" इंगित करने के लिए 0 का उपयोग करेगा। लेकिन एक बुलियन के रूप में, 0 का मतलब झूठा होना चाहिए और nonzero का मतलब सच होना चाहिए। बूलियन सत्य के लिए 0 का उपयोग करने के लिए आपको किसी दिन दैनिक डब्ल्यूटीएफ पर मिल जाएगा।

3

विशेष रूप से जब आप अपने फ़ंक्शन is_foo() नाम देते हैं, मानक सी वर्ण फ़ंक्शन (isdigit(), isupper(), आदि) इसे अपना रास्ता करने के लिए एक अच्छा उदाहरण हैं।

3

सी में 0 से अधिक के अलावा बुलियन की कोई अवधारणा नहीं है, और कुछ भी सत्य है।

0 लौटने का विचार वापसी कोड होने से आता है जो विफलता का संकेत देता है। यदि आप रिटर्न कोड नहीं कर रहे हैं, तो 1 और 0 के इलाज के साथ कुछ भी गलत और गलत नहीं है। आखिरकार, सत्य और गलत सी

में केवल 1 और 0 के लिए टाइप किए गए हैं, हालांकि यह अच्छी तरह से प्रलेखित होना चाहिए, और आपकी फ़ंक्शन टिप्पणियों को स्पष्टता "सत्य या गलत वापसी" कहना चाहिए।

आप यह भी लिख सकते हैं कि (is_invalid_foobar()) है, जो कथन को समझने में आसान बना सकता है और अभी भी अर्थपूर्ण रूप से सही हो सकता है।

0

यह केवल खराब है अगर यह आपको जला देता है। यदि आप इस पर किसी भी बग का पता नहीं लगाते हैं, तो मैं कहूंगा कि आप ठीक हैं। और अधिक महत्वपूर्ण बात यह है कि "इसके लिए शून्य लौटाता है ..."

त्रुटि न ध्वज के साथ कहने का प्रयास करते समय "nonzero एक त्रुटि है" सम्मेलन का उपयोग किया जाता है।

6

थोड़ा समय के बाद से मैं सी प्रोग्राम किया गया है, लेकिन मुझे लगता है तुम यहाँ कार्यों के बारे में दो अलग अलग प्रकार बात कर रहे हैं:

  • is_foo एक कार्यों कि कुछ संपत्ति foo के लिए जाँच करता है और 0 (false) रिटर्न या गैर-0 (true) उस संपत्ति के बूलियन मूल्य को इंगित करने के लिए। उन कार्यों को कॉल करते समय कोई त्रुटि स्थिति अपेक्षित नहीं होती है (और यदि ऐसा होता है, तो यह उन मानों में से एक पर मैप किया जाता है)।
  • foo एक ऐसा फ़ंक्शन है जो क्रिया foo निष्पादित करता है। यह सफलता पर 0 और त्रुटि पर गैर-0 मान देता है।
0
मेरे लिए

, वास्तव में 0 के खिलाफ जाँच और अधिक प्राकृतिक लगता है और संकलक वैसे भी यह अनुकूलन कर तो मैं कुछ उदाहरण

के लिए लिखने के लिए

0

वापसी अगर (check_foo == 0) // करना चाहते एक फ़ंक्शन द्वारा मूल्य - सत्य और गलत या सफलता और त्रुटि के लिए सम्मेलन:

  1. एक एपीआई आदि वापसी मूल्य 0 के साथ सफलता दिखाता है और वापसी मूल्य = गैर शून्य त्रुटि मान के साथ विफलता दिखाता है।
  2. यदि कुछ सच है; कार्य वापसी 1. उदा। isStackEmpty() स्टैक खाली होने पर 1 वापस आ जाएगा।
0

यह अभी भी 1 या 0 लौटने के लिए पूरी तरह से मनमानी है। बस सुसंगत रहें और यदि त्रुटि कोड हैं, कम से कम टिप्पणी करें कि उनका मतलब कहीं भी है।

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

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