簡體   English   中英

使用gcc編譯c程序時發生沖突類型錯誤

[英]conflicting types error when compiling c program using gcc

我試圖用 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: 錯誤:'my_print2' 的類型沖突
  4. greeting.c:8: erroro: 先前隱式聲明 'my_print2' 在那里

如果我在 main 函數之前移動 my_print 和 my_print2 函數,一切都會順利。 那么任何人都可以解釋為什么會出現問題? 謝謝!

如果你沒有聲明一個函數並且它只在被調用后出現,它會被自動假定為int ,所以在你的情況下,你沒有聲明

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

在 main 中調用它之前,所以編譯器假設存在其原型為int my_print2 (char *);函數int my_print2 (char *); int my_print2 (char *); 並且除了返回類型之外,您不能有兩個具有相同原型的函數,因此您會收到conflicting types的錯誤。

正如 Brian 所建議的,在 main 之前聲明這兩個方法。

你必須main()之前聲明你的函數

(或在main()之前聲明函數原型)

事實上,編譯器看到的是my_print (my_string); main()作為函數聲明。

將您的函數移至文件中的main()上方,或放置:

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

在文件中的main()之上。

為了回答更通用的情況,當您選擇某個內置庫中已使用的函數名稱時,會注意到此錯誤。 例如,選擇。

了解它的一個簡單方法是在編譯文件時,編譯器會指出之前的聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM