Hallo,
wie kann ich diese alte C-Funktion in modernes C++ transformieren?
ITEM
cl_read(get1ch)
char (*get1ch) ();
{
…
char c=(*get1ch) ();
…
}
Der Kompiler sagt zu der Anweisung: „Ausdruck ergibt keine Funktion“.
In der Doku steht, dass die Funktion get1ch eine ‚generic function‘ ist, diese ist aber nirgends definiert oder deklariert.
Vielen Dank schonmal.
Ben
Hallo,
hallo
ITEM
cl_read(get1ch)
char (*get1ch) ();
die funktion cl_read erwartet einen zeiger auf die funktion get1ch().
von prinzip muss nur den funktionstyp in der parameterliste stehen
ZB:
aus
int f(i)
int i;
{
…
}
wird
int f(int i)
{
…
}
zu deiner funktion
cl_read(char (*get1ch) ())
{
…
char c=(*get1ch) ();
…
}
ich habe es nicht getestet
Gruss
Youssef
Hallo,
vielen Dank, auf diese Idee bin ich gar nicht gekommen; es war auch das erste Mal, dass mir Zeiger auf Funktionen untergekommen sind.
Ich hab da noch ne Frage.
Kann es sein, dass es in C erlaubt ist Funktionsprototypen ohne die Parameter anzugeben?
z.B.
extern long func(); # im Header
long func(int i) { … } # in der .c Datei
Ben
Hallo,
vielen Dank, auf diese Idee bin ich gar nicht gekommen; es war
auch das erste Mal, dass mir Zeiger auf Funktionen
untergekommen sind.
Hallo
Ich hab da noch ne Frage.
Kann es sein, dass es in C erlaubt ist Funktionsprototypen
ohne die Parameter anzugeben?
z.B.
extern long func(); # im Header
long func(int i) { … } # in der .c Datei
Ben
ja das ist erlaubt und die funktionsdeclaration in C ist nicht obligatorisch.
in c++ ist nicht erlaubt. c++ macht dagegen eine strenge typprüfung weil in c++ das überladen von funktionen erlaubt ist(funktionen mit gleichen name und verschiedene parametertypen zb). hier wird die prototyp mit parametertyp gebraucht um die passende funktion aufzurufen.
Gruss
Youssef
1 „Gefällt mir“
Hallo Ben,
Kann es sein, dass es in C erlaubt ist Funktionsprototypen
ohne die Parameter anzugeben?
z.B.
extern long func(); # im Header
long func(int i) { … } # in der .c Datei
ja das ist erlaubt und die funktionsdeclaration in C ist nicht
obligatorisch.
Es ist sogar noch schlimmer als Youssef es hier schreibt. Der c-Compiler braucht garkeine extern-deklarationen, er warnt vielleicht, wenn er die Funktion nicht kennt. Der Compiler „rät“ dann, welchen Typs die Parameter sein sollen.
Trifft er im selben C-File dann auf die echte Funktion und hat er falsch geraten, dann meldet er sich wieder.
Ist die Funktion aber in einer Library oder einem anderen C-File, dann kracht es womöglich zur Laufzeit, aber es erfolgt keine weitere Warnung (z.B. vom Linker)
Um ernsthaft Programme zu schreiben, sollte man die deklarationen daher sehr gewissenhaft und ausführlich nutzen, und vor allem den Warnlevel so hoch setzen, dass eine fremde Funktion sofort gemeldet wird.
Als junger Programmierer hatte ich keine Zeit dafür, für überflüssiges geschreibse, oder Einrückungen oder geschweifte Klammern bei 1-Statement-Ifs z.B… Heute, wo ich dafür bezahlt werde, habe ich keine Zeit, es zu lassen.
Gruß
achim