No entiendo por qué se puede usar esta función ¡si no debiera!

Iniciado por tecno46, 2 Noviembre 2014, 13:49 PM

0 Miembros y 2 Visitantes están viendo este tema.

tecno46

Hola amigos.
Estoy aprendiendo C y estaba repasando en mi libro de texto el uso de los archivos header o cabecera. Yo me hice un ejercicio compuesto de 4 archivos, que son los siguientes..


  • main.c
  • funciones.c
  • funciones.h
  • global.h

main.c

#include "global.h"
#include "funciones.h"

int main(int argc, char** argv) {
    int i;
    char a, b, c;
    for (i = 1; i < 3; ++i) {
        printf("Introduzca primer caracter: ");
        scanf("%c", &a);
        printf("Introduzca segundo caracter: ");
        flush_in();
        scanf("%c", &b);
        printf("Introduzca tercer caracter: ");
        flush_in();
        scanf("%c", &c);
        printf("Los valores son: %c, %c, %c \n", a, b, c);
        flush_in();
    }
    return (EXIT_SUCCESS);
}



funciones.c

#include "funciones.h"

/* Limpia buffer de entrada */
void flush_in(void) {
    int ch;
    while ((ch = fgetc(stdin)) != EOF && ch != '\n') {}
}



funciones.h

#ifndef YA_INCLUIDOS_FUNCIONES_H
#define YA_INCLUIDOS_FUNCIONES_H

#include "global.h"

#endif /* YA_INCLUIDOS_FUNCIONES_H */



global.h

#ifndef GLOBAL_H
#define GLOBAL_H

#include <stdio.h>
#include <stdlib.h>

#endif /* GLOBAL_H */



Bien, lo que yo no entiendo es ¿cómo puede el compilador hallar la función flush_in en main.c si el header (funciones.h) ni siquiera exporta el prototipo?

Pido disculpas si la pregunta es muy noob, pero yo no la sé :D ...








ivancea96

El caso es que se compilan los .c por separado. Y luego, al linkear, se linkean ambos a la vez.

Para que main compile, requiere saber cómo es la función, que es un dato que le otorga el .h

Eternal Idol

En el caso de C se puede llamar a una funcion no declarada, no lo hagas igual, no tiene utilidad y si puede generar problemas.

http://www.geeksforgeeks.org/g-fact-95/
http://www.geeksforgeeks.org/g-fact-28/
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

tecno46

Gracias por las respuestas.

Entiendo que para usar una función primero hay que declararla ¿verdad? antes que sea utilizada (por lo menos el prototipo de esta) pues bien, eso no ocurre en este caso, porque el archivo funciones.h incluido por main NO CONTIENE LA DECLARACIÓN DE LA FUNCIÓN FLUSH_IN() ¡tampoco su implementación! y aún así el programa compila y se ejecuta correctamente.

De alguna forma que no entiendo el compilador enlaza main y flush_in(), aún sin necesidad de haber sido explícitamente declarada antes de usarla.

Eternal Idol

Cita de: tecno46 en  6 Noviembre 2014, 20:36 PMEntiendo que para usar una función primero hay que declararla ¿verdad?

No, en C no es verdad.

Cita de: Eternal Idol en  2 Noviembre 2014, 18:36 PM
En el caso de C se puede llamar a una funcion no declarada, no lo hagas igual, no tiene utilidad y si puede generar problemas.

http://www.geeksforgeeks.org/g-fact-95/
http://www.geeksforgeeks.org/g-fact-28/
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón