Makronamen in C müssen so aufgebaut sein wie Bezeichner in C, dürfen also zB keinen . enthalten. Konvention ist, Makro-Namen groß zu schreiben, damit man sofort sieht, daß es sich dabei um ein Makro handelt.

C-Funktionen gehören nicht in einen Header, sondern in eine C-Datei. Jede C-Datei wird für sich übersetzt zu einem Objekt (*.o). In dem Objekt sind idR noch externe Referenzen enthalten. Wenn du zB in a.c hast void foo() und willst foo in b.c verwenden, dann schreibst du in b.c #include "a.h" und in a.h steht extern void foo(); was foo bekannt macht.

Beim Compilieren von b.c weiß der Compiler dann, wie er foo zu benutzen hat, ohne daß er wissen muss, was diese Funktion tut.

Zusammengebastelt wird das alles erst beim Linken/Lokatieren. Dort werden die benötigten Module zusammengebunden und festgelegt, wo im Speicher was landet. Ein bisschen dazu steht im Artikel avr-gcc/Interna