2011-04-17 10 views
17

Intenté compilar el siguiente programa con gcc.tipos conflictivos error al compilar el programa c usando 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 } 

Sin embargo, se produce un error y el compilador produce tras registro de errores:

  1. greeting.c: 11: error: Conflicto en los tipos de 'my_print'
  2. greeting.c: 7: Error: previa declaración implícita de 'my_print' estaba aquí
  3. greeting.c: 16: error: conflicto en los tipos de 'my_print2'
  4. greeting.c: 8: erroro: declaración implícita previa de 'my_print2' estaba allí

Y si muevo las funciones my_print y my_print2 antes de la función principal, todo va bien. Entonces, ¿alguien puede explicar por qué ocurre el problema? Gracias!

+0

declaración de función no está presente – Laz

Respuesta

29

Si no se declara una función y que sólo aparece después de ser llamado, se asume automáticamente que int, por lo que en su caso, usted no declaró

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

antes de que lo haga en main, por lo que el compilador asume que hay funciones cuyos prototipos son int my_print2 (char *); y int my_print2 (char *); y no puede tener dos funciones con el mismo prototipo excepto el tipo de retorno, por lo que obtiene el error conflicting types.

Como Brian sugirió, declare esos dos métodos antes de main.

+0

@MByD, Este problema no existe en cygwin pero existe en mingw. Re "* se supone automáticamente que es int *", ¿cuál es el motivo? – Pacerier

+0

@Pacerier: diferentes compiladores pueden generar diferentes errores/advertencias, si es que lo hacen. Y re the "se supone automáticamente que es int" - No sé la razón, solo que fue así hasta C99 (lo que significa que es así por defecto en la mayoría de los compiladores, a menos que especifiques la versión de idioma) – MByD

9

Usted tiene que declarar sus funciones antes de main()

(o declarar los prototipos de las funciones antes main())

Como es, el compilador ve my_print (my_string); en main() como una declaración de la función.

mover sus funciones por encima de main() en el archivo, o dicho de:

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

Por encima de main() en el archivo.

1

Para responder a un caso más genérico, este error se nota al seleccionar un nombre de función que ya se utiliza en alguna biblioteca incorporada. Por ejemplo, seleccione.

Un método simple para saber al respecto es al compilar el archivo, el compilador indicará la declaración anterior.

Cuestiones relacionadas