void oder int bei Deklaration

OP (Firma: allround) #1137767
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
#1137780
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.
Persönliche Seite #1137856
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren