Warum kann Main doppelt deklariert werden und andere Funktionen nicht?

Hallo,

ich stehe gerade irgendwie auf dem Schlauch und verstehe es einfach nicht.
In Arduino in der main.cpp steh folgendes:

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

Wenn ich also in meinem Sketch die main Funktion nicht deklariere läuft die in main.cpp an.
Wird im sketch jedoch:
int main(){code..} deklariert durchläuft dieser nicht mehr die Funktion in main.cpp

Meine Frage:

Wie händelt Arduino das, das er nicht die originale main durchläuft?
Wenn ich weiter Funktionen z.B. micros() neu deklarieren will kommt eine Fehlermeldung, dass ich das nicht machen darf..

Vielen Dank

tausday:
Meine Frage:

Wie händelt Arduino das, das er nicht die originale main durchläuft?

Vorverarbeitung durch die IDE vor dem Kompilieren.
Die Arduino-IDE macht im Hintergrund beim Klick auf “Compile and Upload” mehr als sie offen zeigt.

Das vom GCC compilierte Programm ist nicht 100% identisch mit dem, was Du als “Sketch” im Editor schreibst. Die IDE erzeugt im Rahmen des Kompiliervorgangs zunächst mal ein Programm, das Du aber NICHT zu sehen bekommst, und das wird dann tatsächlich kompiliert. Dieses tatsächlich kompilierte Programm enthält dann beispielsweise

  • entweder den Code der main.cpp Datei, oder die von Dir im Sketch selbstgeschriebene main() Funktion
  • includes für Core-Library-Dateien, aus denen Du Funktionen nutzt, ohne diese Libaries explizit inkludiert zu haben
  • automatisch generierte Prototypen für Funktionen, die Du im Sketch aufrufst, ohne sie vorher deklariert zu haben
  • und anderes magisches Arduino-Zeugs mehr, eben die ganze Arduino-Magie.

Dadurch kann es dann im Verlauf des Kompiliervorgangs zum Beispiel auch dazu kommen, dass Dir ein Compile-Fehler in einer Zeile angezeigt wird, die tatsächlich keinen Fehler enthält. Oder dass scheinbar Fehlermeldungen angezeigt werden, die keinen Bezug zu einer von Dir geschriebenen Codezeile haben. Denn die IDE kann zwar viel, aber sie kann nicht hellsehen. Und deshalb verhaut sie sich manchmal dabei, wo es erlaubt ist, zusätzliches Zeugs wie fehlende Libraries oder fehlende Funktions-Prototypen im Sketch einzufügen, und verschlimmbessert Deine Programmierfehler (fehlende Library-Includes, fehlende Funktionsprototypen) dabei nur noch, statt sie auszubügeln, wie es eigentlich beabsichtigt ist.

Das Verhalten welches du mit der Main Funktion beschrieben hast kann auch so mit anderen Funktionen herbeigerufen werden. Dazu gibt es das "attribute((weak))" Attribut.

Alles was wie folgt definiert ist:

void test_function(int x) __attribute__((weak));

kann später mit anderer Funktionalität überschrieben werden.