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

34

我尝试使用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: error:conflicting types for 'my_print'
  2. greeting.c: 7: error: previous implicit declaration of 'my_print' was here
  3. greeting.c: 16: error:conflicting types for 'my_print2'
  4. greeting.c:8: erroro:previous implicit declaration of 'my_print2' was there

如果我将my_print和my_print2函数移到main函数之前,一切都正常了。 那么有人能解释一下为什么会出现这个问题吗? 谢谢!


1
函数声明不存在。 - Laz
3个回答

56

如果你没有声明一个函数,它只在被调用后出现,那么它会自动假定为 int,所以在你的情况下,你没有声明。

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

在主函数中调用函数之前,编译器会假设有两个具有相同原型的函数int my_print2(char *);int my_print2(char *);,但你不能有两个除返回类型外原型相同的函数,因此你会遇到冲突类型的错误。

像Brian建议的那样,在主函数之前声明这两个方法。


@MByD,这个问题在cygwin中不存在,但在mingw中存在。关于“它自动被认为是int类型”,这是什么原因? - Pacerier
@Pacerier - 不同的编译器可能会引发不同的错误/警告(如果有的话)。至于“它自动被假定为int”的原因,我不知道,只知道在C99之前是这样的(这意味着在大多数编译器中默认情况下是这样的,除非你指定语言版本)。 - MByD

12

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

现在,编译器把main()中的my_print (my_string);视为函数声明。

将你的函数移到文件中main()上方,或者添加:

void my_print (char *);
void my_print2 (char *);
在文件中,main() 上方。

5
为了回答一个更普遍的情况,当你选择一个已经被某个内置库使用的函数名时会注意到这个错误。例如,select。
一个简单的方法是在编译文件时,编译器将指出先前的声明。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接