使用gcc编译c程序时出现冲突类型错误

我试着用gcc编译以下程序。

0 #include  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 *); 除了返回类型之外,你不能拥有两个具有相同原型的函数,因此你会得到conflicting types的错误。

正如Brian建议的那样,在main之前声明这两种方法。

你必须 main() 之前声明你的函数

(或在main()之前声明函数原型)

实际上,编译器会看到my_print (my_string);main()作为函数声明。

将您的函数移动到文件中的main()上方,或者放入:

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

在文件中的main()之上。

要回答更一般的情况,当您选择已在某些内置库中使用的函数名时,会注意到此错误。 例如,选择。

了解它的一个简单方法是在编译文件时,编译器将指示先前的声明。