gcc

2011-04-17 23 views
17

kullanarak c programı derlenirken çelişen türlerde hata Aşağıdaki programı gcc ile derlemeye çalıştım.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 } 

Ancak, başarısız olur ve derleyici aşağıdaki hata günlük üretir:

  1. greeting.c: 11: hatası: 'my_print' için türleri çakışan
  2. greeting.c: 7: hatası: hata:: 8:: erroro: 'my_print2'
  3. greeting.c için türlerini çelişkili 16: greeting.c
  4. 'my_print' önceki örtük bildirim buradaydı 'my_print2' önceki örtük bildirim orada

Ve my_print ve my_print2 işlevlerini ana işlevden önce taşırsam her şey iyi gider. Peki, sorun neden gerçekleştiğini açıklayabilir mi? Teşekkürler!

+0

işlev bildirimi yok – Laz

cevap

29

, senin durumunda böyle, size bunu aramadan önce

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

beyan etmedi Bu nedenle, derleyici, kendi prototiplerinin int my_print2 (char *); ve int my_print2 (char *); olduğu işlevlerin olduğunu ve dönüş türü dışında aynı prototiple iki işlevi bulunamadığını varsaydığından, conflicting types hatasını alırsınız. Brian'ın önerdiği gibi, bu iki yöntemi ana hattan önce ilan edin.

+0

@MByD, Bu sorun cygwin'de bulunmuyor ancak mingw'de var. Re "* otomatik olarak int * olarak kabul edilir", bunun nedeni nedir? – Pacerier

+0

@Pacerier - farklı derleyiciler farklı hata/uyarılar ortaya çıkarabilir. Ve "otomatik olarak int olarak varsayılır" - ben nedenini bilmiyorum, sadece C99'a kadar (yani, çoğu derleyicide varsayılan olarak, dil sürümünü belirtmediğiniz sürece) – MByD

9

Bunu olduğu gibi

, derleyici bir işlev bildiriminde olarak main() yılında my_print (my_string); görürmain()

önce fonksiyonlarını beyan (veya main() önce fonksiyon prototiplerini beyan) gerekmektedir.

dosyasında main() yukarıdaki işlevleri taşıyabilir veya koymak

:

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

main() Üstü dosyada. Eğer bir işlev bildirmek yoktur ve sadece otomatik int olduğu varsayılır, çağrılan sonra görünürse

1

Daha genel bir olayı yanıtlamak için, bazı yerleşik kitaplıklarda zaten kullanılan bir işlev adını seçtiğinizde bu hata fark edilir. Örneğin, seçin.

Dosyayı derlerken basit bir yöntem, derleyici bir önceki bildirimi gösterecektir.