2012-07-25 7 views
20

मैं सोच रहा हूँ कि ऐसा क्यों संकलन होगा:क्यों सी में एक समारोह की प्रोटोटाइप और परिभाषा भिन्न हो सकती है?

int test(); 

int main() { return test((void*)0x1234); } 
int test(void* data) { return 0; } 

क्यों संकलक किसी भी त्रुटि उत्सर्जन नहीं होगा/कि के बारे में चेतावनी (मैं बजना की कोशिश की, जीसीसी)? यदि मैं वापसी मूल्य बदलता हूं तो यह संकलित नहीं होगा - लेकिन तर्क भिन्न हो सकते हैं ?!

+1

[सी शून्य तर्क] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/693788/c-void-arguments) –

उत्तर

28

यदि आप बदलने के लिए:

int test(); 

रहे हैं:

int test(void); 

आप मिल जाएगा अपेक्षित त्रुटि:

foo.c:4: error: conflicting types for ‘test’ 
foo.c:1: error: previous declaration of ‘test’ was here 

जबकि int test(void); एक वास्तविक समारोह प्रोटोटाइप जो एक समारोह जो कोई पैरामीटर लेता है वाणी है इसका कारण यह है int test(); बस एक समारोह जो किसी भी पैरामीटर लेता है (और इसलिए test के अपने बाद के परिभाषा के साथ संगत है) वाणी है (और जो बाद की परिभाषा के साथ संगत नहीं है)।

+3

+1, इसे सी-ईश शब्दावली में बताए जाने के लिए, 'इंट टेस्ट()' बस प्रोटोटाइप नहीं है बल्कि सिर्फ एक घोषणा है। –

+0

लेकिन इस तरह के व्यवहार को जल्द ही हटा दिया जाएगा (या कम से कम यह आईएसओ सी 11 हमें बताता है)। – AnArrayOfFunctions

15
int test(); 

फ़ंक्शन घोषणा में, कोई पैरामीटर नहीं है कि फ़ंक्शन एक अनिर्दिष्ट संख्या में तर्क लेता है।

इस से

int test(void); 

जिसका मतलब है कि समारोह कोई तर्क लेता अलग है।

कोई पैरामीटर के साथ एक फ़ंक्शन घोषणा फ़ंक्शन घोषणा की पुरानी सी शैली है; सी इस शैली को अश्लील के रूप में चिह्नित करता है और इसके उपयोग को हतोत्साहित करता है। संक्षेप में, इसका इस्तेमाल न करें।

आपके मामले में, आप सही पैरामीटर घोषणा के साथ एक समारोह घोषणा उपयोग करना चाहिए:

int test(void *data); 
+0

मैं हमेशा सी को भूल जाता हूं! भले ही यह 'इंट टेस्ट (शून्य) था; लेकिन टीयू को पार करने के लिए डायग्नोस्टिक जारी किए जाने की कोई आवश्यकता नहीं है। – Flexo

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

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