fout met conflicterende typen bij het compileren van het c-programma met gcc

Ik heb geprobeerd het volgende programma te compileren met 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 }

Het mislukt echter en de compiler produceert het volgende foutenlogboek:

  1. greeting.c: 11: error:conflicting types for ‘my_print’
  2. greeting.c: 7: error: vorige impliciete verklaring van ‘my_print’ was hier
  3. greeting.c: 16: error:conflicting types for ‘my_print2’
  4. greeting.c:8: erroro:vorige impliciete verklaring van ‘my_print2’ was aanwezig

En als ik de functies my_print en my_print2 voor de hoofdfunctie verplaats, gaat alles goed.
Dus kan iemand uitleggen waarom het probleem zich voordoet?
Bedankt!


Antwoord 1, autoriteit 100%

Als u een functie niet declareert en deze pas verschijnt nadat deze is aangeroepen, wordt automatisch aangenomen dat deze intis, dus in uw geval heeft u deze niet gedeclareerd

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

voordat je het in main aanroept, dus de compiler gaat ervan uit dat er functies zijn waarvan hun prototypes int my_print2 (char *);en int my_print2 (char *);zijn en je kunt geen twee functies hebben met hetzelfde prototype, behalve het retourtype, dus je krijgt de fout van conflicting types.

Zoals Brian voorstelde, declareer die twee methoden voor de main.


Antwoord 2, autoriteit 23%

U moet uw functies voormain()

declareren

(of declareer de functie-prototypes vóór main())

Zoals het is, ziet de compiler my_print (my_string);in main()als een functiedeclaratie.

Verplaats uw functies boven main()in het bestand, of plaats:

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

Boven main()in het bestand.


Antwoord 3, autoriteit 6%

Om een meer generiek geval te beantwoorden, wordt deze fout opgemerkt wanneer u een functienaam kiest die al in een ingebouwde bibliotheek wordt gebruikt. Selecteer voor bijv.

Een eenvoudige methode om erachter te komen is dat tijdens het compileren van het bestand de compiler de vorige declaratie zal aangeven.

Other episodes