www.mikrocontroller.net

Forum: Compiler & IDEs void oder int bei Deklaration


Autor: Udo Scharnitzki (Firma: allround) (1udo1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

die Funktion

#incude<avr/io.h>

int main(void)
{
   DDRA=0xFF;

   while(1)
   {
   PORTA^=0xF;
   }
}


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

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum sollte main kein return bekommen?

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
>
> 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?!

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:
void __attribute__ ((noreturn)) main_loop (void);

int main (void)
{
   ...
   main_loop();
   // we never come here
}

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

Autor: Udo Scharnitzki (Firma: allround) (1udo1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure ausführliche Hilfe. Tut gut!!!!


Udo

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.