No estas en todo lo cierto. Mira este ejemplo:
Archivo "t.c"
archivo "tt.c"
Código C:
Ver original#include "t.h"
int main2 ()
{
hola();
}
archivo "t.h"
Código C:
Ver original#ifndef NOMBRE_CABECERA
#define NOMBRE_CABECERA
int hola()
{
int p = 1;
}
#endif
Comando para compilar: gcc t.c tt.c
Respuesta del compilador:
Cita: /tmp/ccREYCK2.o: In function `hola':
tt.c:(.text+0x0): multiple definition of `hola'
/tmp/ccunxPRr.o:t.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
Que paso? Sencillo cada archivo cpp tiene su ambiente de definiciones. Por mas que el include de t.c haya definido NOMBRE_CABECERA, el archivo tt.c ni se entero de eso, asi que la vuelve a definir. Como estabamos hablando de una implementacion y no solo de una definicion, el resultado es, dos veces la misma funcion, Y eso es lo que nos dice el compilador multiple definiciones para la funcion hola.
Ese truco de los define sirve para evitar includes en ciclo o que por ejemplo se tengo un archivo "comun.h" y dos archivos que llamen a "comun.h" (a.h y b.h). Si en un archivo .c incluimos a "a.h" y a "b.h", ahi si estamos evitando la doble definicion.
Saludos,