Mit extern ist es kein Problem, wenn es mehrfach auftauch für die gleiche Variable. Es ist ja eine Deklaration (Bekanntmachung) und keine Definition (Oblekt anlegen)!

Bewährt hat sich in C/C++ folgendes:
source.h
Code:
#ifndef _SOURCE_H_
#define _SOURCE_H_

extern int var1;
extern int volatile var2;
extern void mache (int volatile * arg);

#define MAKRO(x) ((x)+1)

#endif /* _SOURCE_H_ */
source.c
Code:
#include "source.h"

int var1;
int volatile var2 = 42;

void mache (int volatile * arg)
{
   *arg = MACHE (*arg);

   var1 = var2;
}
Damit sind Makros und globale Variablen unf Funktionen überall benutzbar, wo der Header inkludiert wird.

Es ist dann auch kein Thema, wenn über verschlungene Umwege ein Header 2 mal inkludiert wird.

Beispiele sind im Wiki bei den C-Quellen zur genüge.