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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.