Uralt C => C++

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 Like

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