Das kann gar kein C++ code sein. Wenn doch war der Programmierer
schlecht :)
im Grunde wird mit den beiden Zeilen ein Funktionszeiger angelegt, dem
man eine Funktion mit drei Argumenten und keinem Rückgabewert zuweisen
kann.
1
typedefvoid(*t_fStateAlive)(void*,bool,int);// ein typdef, damits "lesbarer" wird
SamiDortmund schrieb:> Diese ist aber nirgendwo implementiert
Das ist ein typedef: damit wird ein Aliasname (t_fStateAlive) für
einen Typ angelegt ("Zeiger auf eine Funktion, die nichts zurück
gibt und drei Parameter übernimmt. Der erste ist ein anonymer
Objektzeiger, der zweite ein "bool", der dritte ein "int".).
"Implementiert" wird dabei gar nichts. Man könnte auch stets statt
des typedefs die vollständige Typ-Bezeichnung schreiben.
Gerade bei Funktionszeigern macht ein typedef die Sache häufig
übersichtlicher. Ohne diesen typedef müsste man die Variable so
definieren:
1
void(*m_fupStateAlive)(void*,bool,int);
Besonders, wenn man jetzt eine Funktion deklarieren will, die einen
solchen Zeiger zurückgibt, wird das ziemlich schnell sehr komplex.
Ein typisches Beispiel dafür ist die Bibliotheksfunktion "signal",
die einen Handler installieren kann und gleichzeitig den vorherigen
zurückgibt.
Ohne typedef:
Ich habe noch einen Frage:
Wie kann einen C_Funktionszeiger in C++_Funktionszeiger?
Die Funktionszeiger in C hat keine Implementierung
Keiner N. schrieb:> typedef void(*t_fStateAlive)(void *, bool, int); // ein typdef, damits> "lesbarer" wird> t_fStateAlive m_fupStateAlive; // Zeiger deklarieren>> Jetzt kann man dem Zeiger eine Funktion geben und sie darüber aufrufen> void foo(void *one,bool two, int three){> tuwas();> }>> m_fupStateAlive=foo;>> m_fupStateAlive("bla",true,5);
Danke in voraus
SamiDortmund schrieb:> Wie kann einen C_Funktionszeiger in C++_Funktionszeiger?
Was willst Du mit dieser Frage fragen?
> Die Funktionszeiger in C hat keine Implementierung
Funktionszeiger haben nie eine Implementierung.
So ganz verstehe ich die Frage nicht.
Der Zeiger funktioniert in C++ zumindest erst mal genau so. Wenn man es
übersichtlicher machen wll, kann man std::function benutzen. Das sieht
dann so aus:
Das ist um einiges Ausdrucksstärker als der C Funktionszeiger.
Meine Kritik bezog sich auf das void* in der Argumentenliste der
Funktion. Das macht man in C++ nicht, weil es die Typprüfung aushebel.
Dafür nimmt man Templates. Das würde aber warscheinlich einen größeren
Umbau am Code erfordern.
Aber zum Schluss noch mal. Kannst du bitte deine Frage etwas genauer
stellen? Du hast teilweise nur einen halben Satz hingeschrieben.
PS, wenn dein Englisch besser ist, dann schreib lieber so weiter :)
Keiner N. schrieb:> std::function<void(void*,bool,int) m_fupStateAlive;
Ich glaube, da zieht es irgendwie. ;-)
> Das ist um einiges Ausdrucksstärker als der C Funktionszeiger.
Finde ich nicht. Einfach eine andere Syntax. Wenn man spitze Klammern
mehr mag als runde, dann ist das vielleicht besser …
SamiDortmund schrieb:> Wie mache ich das?
Du benutzt ihn 1:1 weiter.
Das angesprochene Problem der Übergabe eines generischen Zeigers
(void *) kannst du nicht so trivial lösen.
Alles was tu tun musst, ist eine Funktion mit dieser Signatur erstellen,
die macht, was immer eine Funktion machen soll, die von vfuInitialize
aufgerufen wird.
Jörg W. schrieb:> Keiner N. schrieb:>>> std::function<void(void*,bool,int) m_fupStateAlive;>> Ich glaube, da zieht es irgendwie. ;-)>>> Das ist um einiges Ausdrucksstärker als der C Funktionszeiger.>> Finde ich nicht. Einfach eine andere Syntax. Wenn man spitze Klammern> mehr mag als runde, dann ist das vielleicht besser …
Ich finde den Ausdruck um eniges einfacher zu lesen. Mal im direkten
Vergleich:
Keiner N. schrieb:> Ich finde den Ausdruck um eniges einfacher zu lesen.
Glaube ich dir ohne weiteres.
Aber ich finde ihn keineswegs einfacher zu lesen.
Und nun? Patt? ;-)
Es ist doch einfach nur eine Frage der Gewohn(t)heit, mehr nicht. Ein
bisschen verquer muten Funktionszeiger auf den ersten Blick immer an.
ps: Deine zweite Variante ist allerdings falsch geschrieben. Die
korrekte Version ohne typedef hatte ich oben geschrieben.
Jörg W. schrieb:> ps: Deine zweite Variante ist allerdings falsch geschrieben. Die> korrekte Version ohne typedef hatte ich oben geschrieben.
Ach Verdammt :) Ich war so froh, dass std::function eingeführt wurde.
Ich benutze zwar relativ häufig Funktionszeiger, aber mit diesem C-Style
habe ich immer gehadert und musste sie immer "zusammenbasteln".
Vor allem diese fehlende Aufteilung von Datentyp und Bezeichner stört
meinen Lesefluss (und merken kann ich es mir offensichtlich auch nicht
:).
Keiner N. schrieb:> Vor allem diese fehlende Aufteilung von Datentyp und Bezeichner stört> meinen Lesefluss (und merken kann ich es mir offensichtlich auch nicht> :).
Das ist seit C++11 etwas besser geworden, da kann man das jetzt so
machen:
Keiner N. schrieb:> Vor allem diese fehlende Aufteilung von Datentyp und Bezeichner stört> meinen Lesefluss (und merken kann ich es mir offensichtlich auch nicht> nicht :).
Meinen Lesefluss stört es dagegen, wenn plötzlich direkt auf den
Returntyp die Parameter folgen und dazwischen der Name fehlt. Es sieht
völlig anders aus als ein Funktionskopf, und ich erwarte irgendwie, dass
die Definition eines Funktionszeiger auch nahezu genauso aussieht wie
bei einer Funktion.
Niklas G. schrieb:> Geht ähnlich auch für andere Dinge:> using MyArray = int[10];> using MyPtr = int*;
Finde ich genauso eigenartig, weil die syntaktische Analogie zur
Definition entsprechender Variablen verloren gegangen ist.
Rolf M. schrieb:> Keiner N. schrieb:>> Vor allem diese fehlende Aufteilung von Datentyp und Bezeichner stört>> meinen Lesefluss (und merken kann ich es mir offensichtlich auch nicht>> nicht :).>> Meinen Lesefluss stört es dagegen, wenn plötzlich direkt auf den> Returntyp die Parameter folgen und dazwischen der Name fehlt. Es sieht> völlig anders aus als ein Funktionskopf, und ich erwarte irgendwie, dass> die Definition eines Funktionszeiger auch nahezu genauso aussieht wie> bei einer Funktion.
Deshalb schreibt man ja auch
std::function<
davor. Damit ist der Lesefluß vorgewarnt.
Funktionen waren in C und C++ nie first class. Das ist ein Grund dafür
warum
Leute später im Code anderer über Funktionszeiger stolpern.
C++ hat doch jetzt auch Lambdas/Closures. Wobei der alte C typedef auch
Ok ist.