Sí, de hecho esto es la base de la programación modular. Es lo mismo que te han enseñado para las clases pero sin encerrar las funciones dentro de una clase.
Por una parte creas el archivo de cabecera con las declaraciones de las funciones y por otra un archivo de implementación que llevará las definiciones. En éste último harás include del primero.
Compilas el archivo para crear un archivo objeto, librería estática o librería dinámica.
En el programa cliente incluyes la cabecera y a la hora de enlazar para generar el ejecutable o librería debes indicar al enlazador que debe usar el archivo objeto, librería estática o librería dinámica que has compilado con anterioridad.
Ejemplo:
Cabecera: suma.h#ifndef SUMA_H
#define SUMA_H
int suma(int a, int b, int c);
#endif
Implementación: suma.c#include "suma.h"
int suma(int a, int b, int c) {
return a + b + c;
}
Ahora en gcc se genera el archivo objeto
suma.o:
gcc -c suma.c
Programa cliente: programa.c#include <stdio.h>
#include "suma.h"
int main() {
printf("%d\n", suma
(1, 2, 3)); }
Ahora en gcc se compila el programa entero.
gcc programa.c suma.o -o programa
En el archivo de cabecera se pueden ver las guardas con hechas con directivas de preprocesador. Esto es para que no se incluya más de una vez la misma cabecera, cosa que crearía conflictos.