Wenn Du an irgendeiner Stelle in C eine Funktion aufrufst, muss der Compiler nicht wissen, was in der Funktion an Code steht. Er muss aber den Funktionsrumpf (Name, Parameter, Rückgabewert) für die Codeauflösung kennen. Steht die eigentliche Funktion weiter unten hinter dem Aufruf, erledigt man diese Bekanntmachung üblicherweise über eine Funktionsdeklaration (Vorwärtsreferenz):

void DoSomething(int hellIsFrozen); //The forward reference (function header with ending semicolon)

void main(){DoSomething(42);} //The call
void DoSomething(int hellIsFrozen){while(hellIsFrozen);} //The function

Typischer Halbblödenautomatismus: Um die manuelle Deklaration von Vorwärtsreferenzen zu vermeiden, legt der Arduino-Compiler ungefragt für jede Funktion eine Deklaration unterhalb der #includes an. Dass eine dieser Deklarationen einen Datentyp verwendet, der erst danach im Code deklariert wurde, scheint dabei in Kauf genommen zu werden, ebenso wie die nicht reproduzierbare Fehlermeldung, die naturgemäß nur auf eine vom Compiler erzeugte Codezeile (genau auf die automatisch generierte Vorwärtsreferenzzeile, also quasi für den User nicht nachvollziehbar) verweisen kann.

Ich will das Arduino-Konzept nicht allgemein schlecht reden. Aber DAS ist wirklich dilletantisch gemacht.