2012-03-02 12 views
5

संभव डुप्लिकेट:
Error: No previous prototype for function. Why am I getting this error?कोई पिछला प्रोटोटाइप नहीं है?

मैं तथापि Xcode अभी भी मुझे चेतावनी No previous prototype for the function 'printBind' देता है एक समारोह है कि मैं हेडर फाइल में नमूने के लिए है,। मेरे पास setBind फ़ंक्शन एक ही तरीके से प्रोटोटाइप है लेकिन मुझे अपने कार्यान्वयन में इस फ़ंक्शन के लिए चेतावनी नहीं मिली है।

CelGL.h

#ifndef Under_Siege_CelGL_h 
#define Under_Siege_CelGL_h 

void setBind(int input); 
void printBind(); 

#endif 

CelGL.c

#include <stdio.h> 
#include "CelGL.h" 

int bind; 

void setBind(int bindin) { // No warning here? 
    bind = bindin; 
} 

void printBind() { // Warning here 
    printf("%i", bind); 
} 

उत्तर

19

सी में, यह:

void printBind(); 

एक प्रोटोटाइप नहीं है। यह एक ऐसा फ़ंक्शन घोषित करता है जो कुछ भी नहीं देता (void) लेकिन तर्कों की अनिश्चित सूची लेता है। (हालांकि, तर्क की उस सूची चर नहीं है, सभी कार्यों चर लंबाई तर्क सूची लेने दायरे में एक पूर्ण प्रोटोटाइप अपरिभाषित व्यवहार से बचने के लिए होना आवश्यक है।)

void printBind(void); 

समारोह नहीं लेता है कि के लिए एक प्रोटोटाइप है कि तर्क।

सी ++ में नियम अलग-अलग हैं - पहले कोई तर्क नहीं है जिसमें कोई तर्क नहीं है और दूसरे के बराबर है।

अंतर का कारण ऐतिहासिक है (पढ़ें '1 9 80 के दशक के मध्य तक की तारीखें' पढ़ें)। जब सी में प्रोटोटाइप पेश किए गए थे (सी ++ में जोड़े जाने के कुछ सालों बाद), कोड की एक बड़ी विरासत थी जिसने बिना किसी तर्क सूची के कार्यों को घोषित किया (क्योंकि प्रोटोटाइप जोड़े जाने से पहले यह विकल्प नहीं था), इसलिए पीछे की संगतता विचारों का मतलब था कि SomeType *SomeFunction(); को 'एक ऐसा फ़ंक्शन जारी रखना था जो SomeType * देता है लेकिन जिसके लिए हम तर्क सूची के बारे में कुछ नहीं जानते हैं।' सी ++ ने अंततः SomeType *SomeFunction(void); को सी के साथ संगतता के लिए नोटेशन जोड़ा, लेकिन इसकी आवश्यकता नहीं थी क्योंकि प्रकार-सुरक्षित लिंकेज को जल्दी जोड़ा गया था और सभी कार्यों को परिभाषित या उपयोग किए जाने से पहले एक प्रोटोटाइप की आवश्यकता थी।

+0

हालांकि अब मैं त्रुटि के कारण को समझता हूं, मैं वास्तव में इस सुविधा की उपयोगिता को समझ नहीं पा रहा हूं। जब आप एक अनिश्चित पैरामीटर सूची के साथ एक फ़ंक्शन को परिभाषित करेंगे और इसे C++ के साथ वास्तव में क्या करना है? क्या यह सी ++ में एक उपयोगी सुविधा है? – sherrellbc

+0

आप सी ++ में एक अनिश्चित तर्क सूची के साथ एक प्रोटोटाइप परिभाषित नहीं कर सकते हैं। सी ++ में, इसका मतलब है "कोई तर्क नहीं", "अनिश्चित तर्क" नहीं। यह सुविधा वास्तविकता के लिए आवश्यक रियायत के रूप में बहुत उपयोगी नहीं है। जब सी को मानकीकृत किया गया था, तो संपूर्ण विशाल कोड आधार प्रोटोटाइप के बिना लिखा गया था; वे सी में मौजूद नहीं थे। रिक्त संश्लेषण नोटेशन सभी पूर्व-मानक सी में था। अवैध होने के कारण यह नवजात सी मानक को मार डालेगा। यह अभी भी सी 99 के लिए सच था। सी 11 के लिए यह कम स्पष्ट था, लेकिन अपरिवर्तित छोड़ दिया गया था। –

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