conflit de types erreur lors de la compilation du programme c en utilisant gcc

j'ai essayé de compiler le programme suivant avec 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 %sn", 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] = '';    
28   printf ("The string printed backward is %sn", string2);    
29 }

cependant, il échoue et le compilateur produit le journal des erreurs suivant:

  1. message d'accueil.c: 11: erreur:conflicting types for 'my_print'
  2. message d'accueil.C: 7: erreur: la déclaration implicite précédente de 'my_print' était ici
  3. message d'accueil.c: 16: erreur:conflicting types for 'my_print2'
  4. message d'accueil.C: 8: erroro: la précédente déclaration implicite de "my_print2" était il y a

et si je déplace les fonctions my_print et my_print2 avant la fonction principale, tout va bien. Si quelqu'un peut expliquer pourquoi le problème se produit? Merci!

18
c gcc
demandé sur xiao 啸 2011-04-17 09:16:41

3 réponses

Si vous ne déclarez pas une fonction et il n'apparaît qu'après avoir été appelé, il est automatiquement supposé être int, donc dans votre cas, vous n'avez pas à déclarer

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

avant de l'appeler en main, donc le compilateur suppose qu'il y a des fonctions que leurs prototypes sont int my_print2 (char *); et int my_print2 (char *); et vous ne pouvez pas avoir deux fonctions avec le même prototype sauf le type de retour, donc vous obtenez l'erreur de conflicting types.

comme Brian l'a suggéré, déclarez ces deux méthodes avant principal.

32
répondu MByD 2011-04-17 05:27:48

Vous devez déclarer vos fonctions avantmain()

(ou déclarez les prototypes de fonction avant main())

Comme il est, le compilateur voit my_print (my_string);main() comme une déclaration de fonction.

Déplacer vos fonctions ci-dessus main() dans le fichier, ou le mettre:

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

main() dans le fichier.

9
répondu Brian Roach 2011-04-17 05:24:35

pour répondre à un cas plus générique, cette erreur est remarquée lorsque vous choisissez un nom de fonction qui est déjà utilisé dans certaines bibliothèques construites. Par exemple, sélectionnez.

Une méthode simple pour savoir, c'est lors de la compilation du fichier, le compilateur indique la déclaration précédente.

2
répondu Vikas Goel 2015-09-30 00:23:09