Forum: Compiler & IDEs void oder int bei Deklaration


von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Hallo,

die Funktion
1
#incude<avr/io.h>
2
3
int main(void)
4
{
5
   DDRA=0xFF;
6
7
   while(1)
8
   {
9
   PORTA^=0xF;
10
   }
11
}

gibt doch keinen Wert zurück und empfängt auch keinen Wert.

Warum kommt die Fehlermeldung


"warning: return type of 'main' is not 'int'"


wenn ich schreibe
1
void main(void)


Es geht mir hier nur um das Verständnis:

Warum muss die main-Funktion mit Typ integer deklariert werden? Sie ist 
doch void. Es gibt doch gar keinen Return?!

In den Tutorials habe ich bisher keine Erklärung gefunden.


Udo

von Peter (Gast)


Lesenswert?

warum sollte main kein return bekommen?

das return der main ist der exit code bei einem Programm.

von Karl H. (kbuchegg)


Lesenswert?

Udo Scharnitzki wrote:
>
> Warum muss die main-Funktion mit Typ integer deklariert werden? Sie ist
> doch void. Es gibt doch gar keinen Return?!

Du musst über den Tellerrand schauen.
C wird auf einer Unmenge an Plattformen eingesetzt. Die meisten davon 
haben ein Betriebssystem.
main() ist der Einsprungspunkt in ein Programm, also letztendlich die 
Schnittstelle, die dein Programm nach aussen hat. Daher ist main auch 
die einzige Funktion, deren mögliche Argumente bzw. Rückgabewert genormt 
sein müssen, damit Betriebssystembauer sich danach richten können, dass 
das immer gleich ist. Und damit das auch so ist, ist in der 
Sprachdefinition eindeutig festgelegt, welche Möglichkeiten es dafür 
gibt.
Und in der Sprachdefinition wurde festgelegt, das main() einen int zu 
retournieren hat.

PS: main() ist nicht die erste Funktionalität, die von deinem Programm 
ausgeführt wird. Jedes C Programm führt vor main() noch den Startup-Code 
aus, der die Umgebung einrichtet, damit main() loslegen kann. Erst 
nachdem dieser durchlaufen wurde, wird deine main() Funktion aufgerufen. 
Dieser Startup Code erwartet aber, das main(), sollte es zurückkommen, 
einen int als Returnwert liefert. Jenachdem wie clever der Compilerbauer 
das eingerichtet hat, kann das auch gutgehen wenn du main als void 
Funktion baust. Kann - muss aber nicht.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Udo Scharnitzki wrote:
> ...gibt doch keinen Wert zurück...
>
> Warum kommt die Fehlermeldung
>
> "warning: return type of 'main' is not 'int'"
>
> wenn ich schreibe
>
1
> void main(void)
2
>
>
> Es geht mir hier nur um das Verständnis:
>
> Warum muss die main-Funktion mit Typ integer deklariert werden? Sie ist
> doch void. Es gibt doch gar keinen Return?!

Das return kann weggelassen werden, weil es ohnehin toter Code ist wegen 
dem while(1): Die Programmausführung kommt nie an diese Stelle.

Du kannst das return aber gerne hinschreiben der Optik wegen, was aber 
eher verwirrend ist.

In C liefert return einen Status an den Aufrufer, also zB an eine Shell. 
Im vorliegenden Falle gibt es eine solche jedoch nicht. Dafür gibt die 
gcc-Option -ffreestanding, mit der main als void-Funktion definiert ist. 
Aber -ffreestanding hat noch andere Effekte.

Falls am Ende von main() nach der Initialisierung in ein anderes Modul 
weiterleitet, das die Hauptschleife implementiert, und man nach dem 
Aufruf kein return haben will, dann sagt man dem Compiler, daß diese 
Funktion nie zurückkeht. Das ermöglicht auch Optimierungen innerhalb von 
main_loop(), weil sie keine Register sichern muss im Gegensatz zu einer 
normalen Funuktion:
1
void __attribute__ ((noreturn)) main_loop (void);
2
3
int main (void)
4
{
5
   ...
6
   main_loop();
7
   // we never come here
8
}

Die Deklaration kommt natürlich in den Header zu main_loop.

von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Danke für eure ausführliche Hilfe. Tut gut!!!!


Udo

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.