O funcție de apel invers este o funcție, care este un argument, nu un parametru, într-o altă funcție. Cealaltă funcție poate fi numită funcția principală. Deci, sunt implicate două funcții: funcția principală și funcția de apelare în sine. În lista de parametri a funcției principale, este prezentă declarația funcției de apelare fără definirea acesteia, la fel cum sunt prezente declarațiile de obiect fără atribuire. Funcția principală este apelată cu argumente (în main ()). Unul dintre argumentele apelului funcției principale este definiția eficientă a funcției de apel invers. În C ++, acest argument este o referință la definiția funcției de apel invers; nu este definiția propriu-zisă. Funcția callback în sine este de fapt apelată în definiția funcției principale.
Funcția de bază de apel invers în C ++ nu garantează un comportament asincron într-un program. Comportamentul asincron este beneficiul real al schemei de funcții de apel invers. În schema funcției de apel invers asincron, rezultatul funcției principale ar trebui obținut pentru program înainte de a se obține rezultatul funcției de apel invers. Este posibil să faceți acest lucru în C ++; cu toate acestea, C ++ are o bibliotecă numită viitor pentru a garanta comportamentul schemei de funcții de apel invers asincron.
Acest articol explică schema de bază a funcției de apel invers. O mare parte din acesta este cu C pur++. În ceea ce privește apelul invers, este explicat și comportamentul de bază al viitoarei biblioteci. Cunoașterea de bază a C ++ și a indicațiilor sale este necesară pentru înțelegerea acestui articol.
Conținutul articolului
- Schema funcțională de revenire de bază
- Comportament sincron cu funcția de apel invers
- Comportament asincron cu funcție de apel invers
- Utilizarea de bază a viitoarei Biblioteci
- Concluzie
Schema funcțională de revenire de bază
O schemă de funcție de apel invers are nevoie de o funcție principală și de funcția de apelare în sine. Declarația funcției de apel invers face parte din lista de parametri a funcției principale. Definiția funcției de apel invers este indicată în apelul de funcție al funcției principale. Funcția de apel invers este de fapt apelată în definiția funcției principale. Următorul program ilustrează acest lucru:
#includefolosind spațiul de nume std;
int principalFn (char ch [], int (* ptr) (int))
int id1 = 1;
int id2 = 2;
int idr = (* ptr) (id2);
cout<<"principal function: "<
int cb (int iden)
cout<<"callback function"<<'\n';
return iden;
int main ()
int (* ptr) (int) = &cb;
char cha [] = "și";
principalFn (cha, cb);
retur 0;
Ieșirea este:
funcția de apel inversfuncția principală: 1 și 2
Funcția principală este identificată de principalFn (). Funcția de apel invers este identificată prin cb (). Funcția de apel invers este definită în afara funcției principale, dar de fapt apelată în cadrul funcției principale.
Rețineți declarația funcției de apel invers ca parametru în lista de parametri a declarației funcției principale. Declarația funcției de apel invers este „int (* ptr) (int)”. Rețineți expresia funcției de apel invers, ca un apel de funcție, în definiția funcției principale; orice argument pentru apelarea funcției de apel invers este transmis acolo. Declarația pentru acest apel funcțional este:
int idr = (* ptr) (id2);Unde id2 este un argument. ptr face parte din parametru, un pointer, care va fi legat de referința funcției de apel invers în funcția main ().
Rețineți expresia:
int (* ptr) (int) = &cb;În funcția main (), care leagă declarația (fără definiție) a funcției de apel invers cu numele definiției aceleiași funcții de apel invers.
Funcția principală se numește, în funcția main (), ca:
principalFn (cha, cb);Unde cha este un șir și cb este numele funcției de apel invers fără niciun argument al acestuia.
Comportamentul sincron al funcției de apel invers
Luați în considerare următorul program:
#includefolosind spațiul de nume std;
void principalFn (void (* ptr) ())
cout<<"principal function"<<'\n';
(* ptr) ();
nul cb ()
cout<<"callback function"<<'\n';
nul fn ()
cout<<"seen"<<'\n';
int main ()
void (* ptr) () = &cb;
principalFn (cb);
fn ();
retur 0;
Ieșirea este:
funcția principalăfuncția de apel invers
văzut
Există o nouă funcție aici. Noua funcție este de a afișa ieșirea, „văzută”. În funcția main () se numește funcția principală, apoi se numește noua funcție, fn (). Ieșirea arată că a fost executat codul pentru funcția principală, apoi a fost executat cel pentru funcția de apel invers și, în cele din urmă, pentru funcția fn (). Acesta este un comportament sincron (cu un singur fir).
Dacă ar fi un comportament asincron, când trei segmente de cod sunt apelate în ordine, primul segment de cod poate fi executat, urmat în schimb de executarea celui de-al treilea segment de cod, înainte de executarea celui de-al doilea segment de cod.
Ei bine, funcția, fn () poate fi apelată din definiția funcției principale, în loc de din interiorul funcției main (), după cum urmează:
#includefolosind spațiul de nume std;
nul fn ()
cout<<"seen"<<'\n';
void principalFn (void (* ptr) ())
cout<<"principal function"<<'\n';
fn ();
(* ptr) ();
nul cb ()
cout<<"callback function"<<'\n';
int main ()
void (* ptr) () = &cb;
principalFn (cb);
retur 0;
Ieșirea este:
funcția principalăvăzut
funcția de apel invers
Aceasta este o imitație a comportamentului asincron. Nu este un comportament asincron. Este încă un comportament sincron.
De asemenea, ordinea de execuție a segmentului de cod al funcției principale și a segmentului de cod al funcției de apel invers poate fi schimbată în definiția funcției principale. Următorul program ilustrează acest lucru:
#includefolosind spațiul de nume std;
void principalFn (void (* ptr) ())
(* ptr) ();
cout<<"principal function"<<'\n';
nul cb ()
cout<<"callback function"<<'\n';
nul fn ()
cout<<"seen"<<'\n';
int main ()
void (* ptr) () = &cb;
principalFn (cb);
fn ();
retur 0;
Ieșirea este acum,
funcția de apel inversfuncția principală
văzut
Aceasta este, de asemenea, o imitație a comportamentului asincron. Nu este un comportament asincron. Este încă un comportament sincron. Un adevărat comportament asincron poate fi obținut așa cum este explicat în secțiunea următoare sau în bibliotecă, în viitor.
Comportament asincron cu funcție de apel invers
Pseudo-codul pentru schema de bază a funcției de apel invers asincron este:
tip ieșire;tip cb (tip ieșire)
// declarații
tip principalFn (tip intrare, tip cb (tip ieșire))
// declarații
Rețineți pozițiile datelor de intrare și ieșire în diferite locuri ale pseudo-codului. Intrarea funcției de apel invers este ieșirea acesteia. Parametrii funcției principale sunt parametrul de intrare pentru codul general și parametrul pentru funcția de apel invers. Cu această schemă, o a treia funcție poate fi executată (apelată) în funcția main () înainte de citirea ieșirii funcției de apel invers (încă în funcția main ()). Următorul cod ilustrează acest lucru:
#includefolosind spațiul de nume std;
ieșire char *;
nul cb (descărcare [])
output = out;
void principalFn (char input [], void (* ptr) (char [50]))
(* ptr) (intrare);
cout<<"principal function"<<'\n';
nul fn ()
cout<<"seen"<<'\n';
int main ()
char input [] = "funcție de apel invers";
void (* ptr) (char []) = &cb;
principalFn (intrare, cb);
fn ();
cout<