Forum: Compiler & IDEs Funktionen und Prototypen


von Donald Rumsfeld (Gast)


Lesenswert?

Hi

Ich habe gerade mit C Programmierung von AVRs angefangen. Ich verstehe
nur nicht, warum man in C Funktionsprototypen braucht (da es ja auch
ohne funzt)

Speziell bei den Interruptfunktionen z.B. SIGNAL(SIG_ADC) wird in
keinem Beispielprogramm ein Funktionsprototyp benutzt. Und ich wüsste
auch nicht, wie der aussehen würde, da z.B.

int SIGNAL(SIG_ADC);

vom Compiler mit einer Warnung, dass der Datenttyp von SIG_ADC nicht
angegeben ist beanstandet wird. So, das waren jetzt ja mehrere Fragen
aber auch für Teilantworten bin ich sehr dankbar

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ein anderes Wort für Funktionsprototyp ist Vorwärtsdeklaration.

Er ist dann erforderlich, wenn der Aufruf einer Funktion vor deren
eigentlicher Definition erfolgt. Dann nämlich ist die Funktion dem
Compiler noch unbekannt, und der Compiler kann weder die korrekte
Schreibweise des Funktionsaufrufs noch die Korrektheit der übergebenen
Parameter überprüfen.

Dasselbe trifft auf Funktionen zu, die außerhalb des Modules definiert
sind, in dem sie aufgerufen werden.

Das hat damit zu tun, daß C-Compiler "single-pass"-Compiler sind, die
den übergebenen Quelltext nur einmal analysieren. Andere
Programmiersprachen verwenden "multiple-pass"-Compiler, die im Falle
des Aufrufs einer Funktion sich ersteinmal deren Definition näher
ansehen.

Die spezifische Notation der Interruptfunktionen, wie sie in
gcc/gcc-avr implementiert werden, ist nicht Bestandteil von C als
Programmiersprache. Aller Wahrscheinlichkeit nach wird das mit recht
aufwendigen Makrokonstrukten realisiert.

von Reiner (Gast)


Lesenswert?

Hallo

"Ich habe gerade mit C Programmierung von AVRs angefangen. Ich
verstehe nur nicht, warum man in C Funktionsprototypen braucht (da es
ja auch ohne funzt)"

Das ist richtig, es funktioniert auch ohne.  Frühere C-Standards
kannten die Prototypen auch nicht.
Der Vorteil die Prototypen zu benutzen liegt darin, daß der Compiler
die Möglichkeit hat den Funktionsaufruf, den Rückgabewert und die
Parameter zu überprüfen.  Programmierfehler werden dadurch
eingeschränkt!  Hat man keinen Prototypen, kann man einer Funktion, die
z.B. einen Integer erwartet auch als Parameter einen Pointer
"unterjubeln" was sicher zu interessanten Ergebnissen führt.

Kurz gesagt,  man kann sich auch mit einer Rasierklinge ohne Griff
rasieren, sollte dabei aber sehr vorsichtig sein. ):-

Reiner

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Die spezifische Notation der Interruptfunktionen, wie sie in
> gcc/gcc-avr implementiert werden, ist nicht Bestandteil von C als
> Programmiersprache. Aller Wahrscheinlichkeit nach wird das mit recht
> aufwendigen Makrokonstrukten realisiert.

Es sind streng genommen zwei Makros, die hier mitspielen.

SIGNAL (bzw. neu jetzt ISR) deklariert dabei in der Tat sogar einen
Funktionsprototypen, an den das Attribut für die Interrupt-
Funktionalität angehängt wird.  In der darauffolgenden Zeile wird dann
sofort mit der Definition der Funktion begonnen.

Der zweite Makro ist der Vektorname, der löst in __vector_N auf, wobei
N die Nummer des Interruptvektors in der Vektortabelle ist.  Die
Vektortabelle selbst ist in der Bibliothek vordefiniert, wobei die
Applikation die Möglichkeit hat, ihre eigenen ISRs über diese Namen
,,aufzudrängeln''.

von Donald Rumsfeld (Gast)


Lesenswert?

Soso
Vielen Dank für eure Antworten. Ja, das mit den Interrupts sind
garkeine Funktionen sondern MAkros und brauchen deshalb keine
Deklaration (scheinbar). Und das mit den Funktionen und deren
Prototypen habe ich jetzt (besonders dank Reiner) auch verstaden.

Sehr schön

von johnny.m (Gast)


Lesenswert?

Hallo,

kleine Ergänzung:
selbst wenn man eine isr als Funktion sieht (in manchen 'echten'
Embedded-C-Compilern wie z.B. CodeVision oder Keil sehen die nämlich
genau so aus wie ne normale Funktion, nur dass das Schlüsselwort
'interrupt' davor oder dahinter steht), ist eine
Prototypen-Deklaration nicht sinnvoll, da eine isr eh nicht aus dem
Programm heraus aufgerufen werden kann, sondern nur durch das
entsprechende Hardware-Ereignis.

Gruß

Johnny

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.