2016-10-21 20 views
5

पर पैरामीटर के रूप में फ़ंक्शन मैंने अभी देखा है कि यह -pedantic -Wall और clang दोनों के साथ -pedantic -Wall का उपयोग करके किसी भी त्रुटि या चेतावनियों के बिना संकलित करता है।फ़ंक्शन

#include <stdio.h> 

int x = 0; 

void func(int f(const char *)) { 
    f("func()!"); 
} 

int main(void) { 
    func(puts); 
} 

ऐसा लगता है कि पैरामीटर f इस मामले में int (*)(const char *) कार्य करने के लिए सूचक माना जाता है।

लेकिन यह एक ऐसा व्यवहार है जिसे मैंने कभी नहीं देखा या सुना है। क्या यह कानूनी सी कोड है? और यदि ऐसा है तो क्या होता है जब आपके पास फ़ंक्शन के पैरामीटर के रूप में फ़ंक्शन होता है?

+1

फ़ंक्शन पॉइंटर्स मान्य पैरामीटर हैं, उदाहरण के लिए आप उनके साथ अलग-अलग कॉलबैक फ़ंक्शन पास कर सकते हैं। वह कार्य जो उन्हें प्राप्त करता है, फिर उस फ़ंक्शन को कॉल कर सकता है, कोई समस्या नहीं है। –

+1

इस मामले में पैरामीटर का प्रकार "फ़ंक्शन" के रूप में लिखा गया है और "फ़ंक्शन के लिए पॉइंटर" के रूप में नहीं लिखा गया है, इस मामले में इसे 'int (* f) (const char *)' घोषित किया गया होगा। – wefwefa3

+0

यह वाक्य रचनात्मक चीनी है और इसे पढ़ने के लिए घोषणाओं को आसान बनाने की अनुमति है। डुप्लिकेट प्रश्न के स्वीकृत उत्तर पर पहली टिप्पणी देखें। –

उत्तर

2

मानक द्वारा इसकी अनुमति है। C99 मानक अध्याय 6.9.1 से (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf से लिया):

उदाहरण 2 एक से दूसरे समारोह पारित करने के लिए, एक

int f(void); 
/*...*/ 
g(f); 

कह सकते हैं तो फिर जी की परिभाषा पढ़ सकता है

void g(int (*funcp)(void)) 
{ 
    /*...*/ 
    (*funcp)(); /* or funcp(); ... */ 
} 

या, समतुल्य रूप,

void g(int func(void)) 
{ 
    /*...*/ 
    func(); /* or (*func)(); ... */ 
}