error de tipos en conflicto al compilar el programa c usando gcc

2 minutos de lectura

Traté de compilar el siguiente programa con 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, falla y el compilador genera el siguiente registro de errores:

  1. saludo.c: 11: error: tipos en conflicto para ‘mi_impresión’
  2. saludo.c: 7: error: la declaración implícita anterior de ‘mi_impresión’ estaba aquí
  3. saludo.c: 16: error: tipos en conflicto para ‘my_print2’
  4. saludo.c: 8: erroro: la declaración implícita anterior 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!

  • declaración de función no presente

    – Laz

    17 de abril de 2011 a las 5:39

Si no declara una función y solo aparece después de ser llamada, automáticamente se asume que es intentonces en tu caso, no declaraste

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

antes de llamarlo 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 del tipo de retorno, por lo que obtiene el error de conflicting types.

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

  • @MByD, este problema no existe en cygwin pero existe en mingw. Re “automáticamente se asume que es int“, ¿cuál es la razón de eso?

    – Pacerier

    4 de marzo de 2017 a las 13:04

  • @Pacerier: diferentes compiladores pueden generar diferentes errores/advertencias, en todo caso. Y en cuanto a “se supone automáticamente que es int”, no sé el motivo, solo que fue así hasta C99 (lo que significa que es así de forma predeterminada en la mayoría de los compiladores, a menos que especifique la versión del idioma)

    – MByD

    4 de marzo de 2017 a las 13:08

avatar de usuario
Brian Cucaracha

Tienes que declarar tus funciones. antes de main()

(o declarar los prototipos de función antes main())

Tal como está, el compilador ve my_print (my_string); en main() como una declaración de función.

Mueva sus funciones arriba main() en el archivo, o poner:

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

Encima main() en el archivo.

Para responder a un caso más genérico, este error se nota cuando elige un nombre de función que ya se usa en alguna biblioteca integrada. Por ejemplo, seleccione.

Un método sencillo para saberlo es mientras se compila el archivo, el compilador indicará la declaración anterior.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad