2012-01-23 16 views
11

मुझे यकीन नहीं है कि सी में स्थिर कार्यों के लिए प्रोटोटाइप होना वास्तव में आवश्यक है। जब तक मैं ऐसे कार्यों का निर्यात नहीं कर रहा हूं (यानी उनके पास बाहरी संबंध नहीं है) यह क्या लाभ हो सकता है?'स्थिर' कार्यों के लिए प्रोटोटाइप

धन्यवाद।

उत्तर

6

उदा। यदि आपको यह सुनिश्चित करने की आवश्यकता है कि किसी फ़ंक्शन का एक निश्चित प्रकार हो, तो यह उपयोगी हो सकता है।

पर विचार करें:

// Define how the functions should be defined. 
typedef void * jobfunc(void *); 

// Use case 
void addjob(jobfunc *); 

// Ensure they have the right type. Without this, you only get a warning 
// for addjob(job2) (see below) - with it, you get an error for the mismatch. 
static jobfunc job1; 
static jobfunc job2; 

// Define one job 
static void * job1(void * arg) { 
    return NULL; 
} 

// Define another job - accidentally wrong. 
static void * job2(int accidentally_wrong) { 
    return NULL; 
} 
+3

मुझे लगता है कि टाइपपीफ का उपयोग किसी प्रकार के फ़ंक्शन टेम्पलेट के रूप में अस्पष्ट अभ्यास है, यह संभवतः पाठक को भ्रमित कर देगा। उदाहरण के लिए मुझे यह समझने में थोड़ी देर लग गई कि आपका कोड वास्तव में क्या करता है। कोड के लिए मेरी तत्काल लेकिन गलत प्रतिक्रिया "आह - फ़ंक्शन पॉइंटर्स" थी। – Lundin

+0

@ लुंडिन आप सही हैं जहां तक ​​यह असामान्य है। लेकिन यह अपनी नौकरी करता है। हो सकता है कि 'शून्य * 'वापसी प्रकार ने भ्रम जोड़ा है - एक उदाहरण के रूप में, मुझे एक अलग प्रकार लेना चाहिए था। हालांकि, मुझे समझ में नहीं आता कि यह इतना असामान्य क्यों है - सही प्रकार सुनिश्चित करना और अज्ञातता के कारण भ्रम और भ्रम के अलावा, मुझे कोई नुकसान नहीं दिख रहा है। – glglgl

6

यदि आप कार्यान्वयन से पहले उनका उपयोग करना चाहते हैं, तो आपको प्रोटोटाइप लिखना चाहिए।

आमतौर पर, आप कार्यों के क्रम को बदल सकते हैं, लेकिन यदि आपके पास 2 स्थिर कार्य हैं, जो एक-दूसरे को कॉल करते हैं?

+0

@ मार्क: उदाहरण के लिए, कंपाइलर को यह जानने की आवश्यकता है कि 'foo' फ़ंक्शन के हस्ताक्षर 'foo' फ़ंक्शन पर कॉल को पार्स करने से पहले क्या है, ताकि यह सुनिश्चित किया जा सके कि' foo' को कॉल सही पैरामीटर को धक्का देता है और ऐसे । –

+0

asaelr: क्या आप अपनी टिप्पणी पर विस्तार कर सकते हैं? 'कार्यान्वयन से पहले उपयोग करके' का क्या मतलब है? – Mark

+0

जैसे ओह ने लिखा, मेरा मतलब है कि आप कॉलली फ़ंक्शन के ऊपर कॉलर फ़ंक्शन लिख सकते हैं। – asaelr

3

एक (मामूली) सुविधा यह है कि यह आपको फ़ाइल में कहीं भी कहीं भी काम करने की अनुमति देगा। उदाहरण के लिए, यदि आप फ़ाइल के अंत में अपने उपयोगिता कार्यों को रखना चाहते हैं, तो आपको उन्हें घोषित करना होगा।

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

4

static फ़ंक्शन की परिभाषा के बिना एक घोषणा (यह extern फ़ंक्शन के लिए समान है) फ़ंक्शन को परिभाषित करने से पहले फ़ंक्शन को कॉल करने दें। सी में, एक समारोह के लिए एक पहचानकर्ता से पहले ही इस्तेमाल किया जा सकता घोषित किया जाना है:

static void foo(void); 

void bar(void) 
{ 
    foo(); 
} 

static void foo(void) 
{ 
    ... 
} 
+0

व्यापक उत्तर के लिए सभी को धन्यवाद! – Mark

8

कुछ अधिकार का हवाला देते हैं करने के लिए, मिश्रा-सी: 2004 नियम 8.1 बाहरी लिंकेज के साथ कार्यों के लिए प्रोटोटाइप को लागू करता है, लेकिन यह भी आंतरिक संबंध का उल्लेख है :

"आंतरिक लिंकेज के साथ एक समारोह के लिए एक प्रोटोटाइप के प्रावधान अच्छा प्रोग्रामिंग अभ्यास है।"

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

+1

यह कुछ एमआईएसआरए नियम हैं जो मैं सहमत हूं। मैं हमेशा स्रोत फ़ाइल में परिभाषित सभी 'स्थिर' कार्यों की 'स्थैतिक' फ़ंक्शन घोषणाओं को 'स्रोत फ़ाइल के शीर्ष पर) डालता हूं। यह कोड और आंतरिक एपीआई का एक अच्छा प्रलेखन है। – ouah

0

आप समारोह प्रोटोटाइप की घोषणा नहीं करेगा, तो नीचे दिए गए कोड मान्य होगा।

static int bar() 
{ 

}; 

int foo() 
{ 
    bar("asdf"); 
}; 

और इस तरह की छिपी हुई त्रुटियां खतरनाक हो सकती हैं। अनुभाग "2 7 .2.2 फ़ंक्शन तर्क प्रकार जांच" फिर से उपयोगी सिद्धांत और अभ्यास C++ [Bjarne Stroustrup] का उपयोग कर हो सकता है।

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