Das übliche Vorgehen ist, daß man zu jedem Modul, das Funktionen/Objekte bringt, die in anderen Modulen verwendet werden, einen Header-File macht.

In modul.c: (Implementierung+Instanziierung von globalen Funcs und Objekten, Modul-lokale typedefs, #define, ...)
Code:
#include "module.h"

// lokal in module.c

typedef ... local_t;

#define MODULE_MACRO ....

static type3_t bar_module(...);

// global
type1_t foo;

type2_t bar (...)
{
   ...
}

static type3_t bar_module(...)
{
   ...
}
In modul.h: (Bekanntmachung, globale #defines, globale typedefs)
Code:
#ifndef _MODULE_H_
#define _MODULE_H_

typedef ... global_t;
#define GLOBAL_MACRO ...

extern type1_t foo;
extern type2_t bar (...);

#endif // _MODULE_H_
In sonstwas.c
Code:
#include "module.h"

func()
{
   // Verwenden von Makros, Funktionen, Typen, Objekten aus module
}