2011-08-21 11 views
22

कहें कि मेरे पास यह फ़ंक्शन है:मैं एक बहुत से तर्क के साथ एक सूचक के माध्यम से एक समारोह क्यों बुला सकता हूं?

int func2() { 
    printf("func2\n"); 
    return 0; 
} 

अब मैं एक पॉइंटर घोषित करता हूं:

int (*fp)(double); 

यह एक फ़ंक्शन को इंगित करना चाहिए जो double तर्क लेता है और int देता है।

func2 में कोई तर्क नहीं है, लेकिन फिर भी जब मैं लिखता हूं:

fp = func2; 
fp(2); 

(2 केवल एक मनमाना संख्या होने के साथ), func2` सही ढंग से लागू किया जाता है।

वह क्यों है? क्या फ़ंक्शन पॉइंटर के लिए घोषित पैरामीटर की संख्या का कोई अर्थ नहीं है?

+0

संक्षिप्त उत्तर "किसी भी तर्क के साथ एक फ़ंक्शन घोषित करना है ... और फिर जानबूझकर एक तर्क पारित करना ... गलत है"। – paulsm4

उत्तर

46

हां, एक अर्थ है। सी में (लेकिन सी ++ में नहीं), ब्रांड्स के खाली सेट के साथ घोषित एक फ़ंक्शन का अर्थ है कि निर्दिष्ट पैरामीटर पैरामीटर की संख्या लेता है। जब आप ऐसा करते हैं, तो आप संकलक को संख्याओं और तर्कों के प्रकारों की जांच करने से रोक रहे हैं; एएनएसआई और आईएसओ द्वारा सी भाषा को मानकीकृत करने से पहले यह एक होल्डओवर है।

उचित संख्या और तर्क के प्रकार के साथ फ़ंक्शन को कॉल करने में विफल होने के परिणामस्वरूप अपरिभाषित व्यवहार में परिणाम होता है।

int func1(); // declare function taking unspecified parameters 
int func2(void); // declare function taking zero parameters 
... 
// No warning, since parameters are potentially compatible; calling will lead 
// to undefined behavior 
int (*fp1)(double) = func1; 
... 
// warning: assignment from incompatible pointer type 
int (*fp2)(double) = func2; 
-4

आप स्पष्ट रूप से घोषित करने के लिए की जरूरत है: आप के बजाय स्पष्ट रूप से अपने समारोह की घोषणा तो void की एक पैरामीटर सूची का उपयोग करके शून्य मापदंडों लेने के लिए है, तो संकलक आप एक चेतावनी है जब आप गलत प्रकार के एक समारोह सूचक आवंटित दे देंगे पैरामीटर, अन्यथा आपको अपरिभाषित व्यवहार मिलेगा :)

int func2(double x) 
{ 
    printf("func2(%lf)\n", x); 
    return 0; 
} 
संबंधित मुद्दे