2011-04-17 18 views
17

का उपयोग कर सी प्रोग्राम संकलित करते समय विरोधाभासी प्रकार त्रुटि, मैंने निम्नलिखित प्रोग्राम को gcc के साथ संकलित करने का प्रयास किया।जीसीसी

0 #include <stdio.h> 
1 
2 main() 
3 
4 {  
5 char my_string[] = "hello there";  
6 
7 my_print (my_string);  
8 my_print2 (my_string);  
9} 
10 
11 void my_print (char *string) 
12 {  
13 printf ("The string is %s\n", string);  
14 } 
15   
16 void my_print2 (char *string) 
17 { 
18 char *string2;  
19 int size, i; 
20 
21 size = strlen (string);  
22 string2 = (char *) malloc (size + 1); 
23 
24 for (i = 0; i < size; i++)  
25 string2[size - i] = string[i]; 
26 
27 string2[size+1] = '\0';  
28 printf ("The string printed backward is %s\n", string2);  
29 } 

हालांकि, यह विफल रहता है और संकलक निम्न त्रुटि लॉग पैदा करता है:

  1. greeting.c: 11: त्रुटि: 'my_print' के लिए प्रकार परस्पर विरोधी
  2. greeting.c: 7: त्रुटि: 'my_print' के पिछले निहित घोषणा यहाँ था
  3. greeting.c: 16: त्रुटि: 8:: erroro: 'my_print2'
  4. greeting.c के लिए प्रकार परस्पर विरोधी 'my_print2' के पिछले निहित घोषणा था वहाँ

और यदि मैं मुख्य कार्य से पहले my_print और my_print2 फ़ंक्शंस को स्थानांतरित करता हूं, तो सब कुछ ठीक हो जाता है। तो क्या कोई यह समझा सकता है कि समस्या क्यों होती है? धन्यवाद!

+0

फ़ंक्शन घोषणा – Laz

उत्तर

29

आप एक समारोह घोषित नहीं करते और यह केवल बुलाया जा रहा है के बाद दिखाई देता है, यह स्वचालित रूप से int माना जाता है, इसलिए आपके मामले में, आप यह घोषणा नहीं की थी

void my_print (char *); 
void my_print2 (char *); 

से पहले उसमें फोन मुख्य, इसलिए संकलक मानते हैं कि उनके प्रोटोटाइप int my_print2 (char *); और int my_print2 (char *); हैं और आपके पास वापसी प्रकार को छोड़कर एक ही प्रोटोटाइप के साथ दो कार्य नहीं हो सकते हैं, इसलिए आपको conflicting types की त्रुटि मिलती है।

जैसा कि ब्रायन ने सुझाव दिया था, मुख्य रूप से उन दो तरीकों की घोषणा करें।

+0

@MByD मौजूद नहीं है, यह समस्या साइगविन में मौजूद नहीं है लेकिन mingw में मौजूद है। पुन "* यह स्वचालित रूप से int * माना जाता है", इसके लिए क्या कारण है? – Pacerier

+0

@Pacerier - अलग-अलग कंपाइलर्स अलग-अलग त्रुटियों/चेतावनियों को बढ़ा सकते हैं यदि बिलकुल भी। और फिर "इसे स्वचालित रूप से int माना जाता है" - मुझे कारण पता नहीं है, केवल इतना है कि यह C99 तक था (जिसका अर्थ है कि यह अधिकांश कंपाइलरों में डिफ़ॉल्ट रूप से ऐसा होता है, जब तक आप भाषा संस्करण निर्दिष्ट नहीं करते) – MByD

9

आपmain()

से पहले अपने कार्यों घोषित (या main() से पहले समारोह प्रोटोटाइप की घोषणा)

यह है के रूप में, संकलक my_print (my_string);main() में एक समारोह घोषणा के रूप में देखता है करने के लिए है। फ़ाइल में

void my_print (char *); 
void my_print2 (char *); 

main() ऊपर:

फ़ाइल में main() ऊपर अपने कार्यों ले जाएँ, या डाल दिया।

1

अधिक सामान्य मामले का उत्तर देने के लिए, यह त्रुटि तब देखी जाती है जब आप फ़ंक्शन नाम चुनते हैं जो कि पहले से निर्मित कुछ लाइब्रेरी में उपयोग किया जाता है। उदाहरण के लिए, चुनें।

फ़ाइल को संकलित करते समय इसके बारे में जानने के लिए एक सरल विधि है, संकलक पिछली घोषणा का संकेत देगा।