Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: tecno46 en 2 Noviembre 2014, 13:49 pm



Título: No entiendo por qué se puede usar esta función ¡si no debiera!
Publicado por: tecno46 en 2 Noviembre 2014, 13:49 pm
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
Código:
#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
Código:
#include "funciones.h"

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


funciones.h
Código:
#ifndef YA_INCLUIDOS_FUNCIONES_H
#define YA_INCLUIDOS_FUNCIONES_H

#include "global.h"

#endif /* YA_INCLUIDOS_FUNCIONES_H */


global.h
Código:
#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 ...









Título: Re:
Publicado por: ivancea96 en 2 Noviembre 2014, 16:39 pm
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


Título: Re: No entiendo por qué se puede usar esta función ¡si no debiera!
Publicado por: 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/


Título: Re: No entiendo por qué se puede usar esta función ¡si no debiera!
Publicado por: tecno46 en 6 Noviembre 2014, 20:36 pm
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.


Título: Re: No entiendo por qué se puede usar esta función ¡si no debiera!
Publicado por: Eternal Idol en 6 Noviembre 2014, 20:49 pm
Entiendo que para usar una función primero hay que declararla ¿verdad?

No, en C no es verdad.

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/