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

xia*_*o 啸 23 c 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 }
Run Code Online (Sandbox Code Playgroud)

但是,它失败并且编译器生成以下错误日志:

  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函数,一切顺利.所以有人能解释为什么会出现这个问题吗 谢谢!

MBy*_*ByD 40

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

void my_print (char *);
void my_print2 (char *);
Run Code Online (Sandbox Code Playgroud)

之前你怎么称呼它在主,所以编译器假设有功能,这它们的原型int my_print2 (char *);int my_print2 (char *);你不能有相同的原型两个功能不同的返回类型,所以你得到的错误conflicting types.

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


Bri*_*ach 9

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

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

正因为如此,编译器看到my_print (my_string);main()是一个函数声明.

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

void my_print (char *);
void my_print2 (char *);
Run Code Online (Sandbox Code Playgroud)

main()在文件上方.


Vik*_*oel 5

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

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